,ama zashto?
15 отговора
542 прегледа
,ama zashto?
Da rechem che imame:
char *string;
koe e po pravilno pri zadavane na pamet?
string=(char *)malloc(10);
ili
string=(char *)malloc(10*(char));
или
string=(char *)malloc(10*(char*));
char *string;
koe e po pravilno pri zadavane na pamet?
string=(char *)malloc(10);
ili
string=(char *)malloc(10*(char));
или
string=(char *)malloc(10*(char*));
Re: ,ama zashto?
char *string = (char *)malloc(10);
ako char-a stane 16 bita, to naj-verojatno 10 shte znachi 10 x 16 bita, a ne 10 x 8 bita (Wupreki che teoreticheski mozhe da ne sum prav, prakticheski ne vjarvam tova da ne stane taka - tuj kato sumati star kod trjabwa da se portne - sushtoto e kato sus NULL i 0 - NULL e vinagi 0 kakvoto i da stava (prakticheski)).
Taka che da ne si uslozhnjawash zhivota - izpolzwaj char *string = (char *)malloc(10);
ako e tip razlichen ot char, ili typedef'-nat ot char - togava izpolzwaj
someType *elements;
elements = (someType *)malloc( sizeof(elements[0]) * 10 ) - tova spored men (lihcno mnenie) e naj-razbranoto kato gledash sors koda...
To err is human
To stderr is inhuman
ako char-a stane 16 bita, to naj-verojatno 10 shte znachi 10 x 16 bita, a ne 10 x 8 bita (Wupreki che teoreticheski mozhe da ne sum prav, prakticheski ne vjarvam tova da ne stane taka - tuj kato sumati star kod trjabwa da se portne - sushtoto e kato sus NULL i 0 - NULL e vinagi 0 kakvoto i da stava (prakticheski)).
Taka che da ne si uslozhnjawash zhivota - izpolzwaj char *string = (char *)malloc(10);
ako e tip razlichen ot char, ili typedef'-nat ot char - togava izpolzwaj
someType *elements;
elements = (someType *)malloc( sizeof(elements[0]) * 10 ) - tova spored men (lihcno mnenie) e naj-razbranoto kato gledash sors koda...
To err is human
To stderr is inhuman
абе я и мене ме светнете за malloc
за какъв чеп се ползва malloc, вместо new?
аз съм засега върл противник на ползването на malloc и ако не посочите някаква сериозна кирия такъв ще си и остана. освен това при malloc трябва и конструктора да викаш на ръка...
аз съм засега върл противник на ползването на malloc и ако не посочите някаква сериозна кирия такъв ще си и остана. освен това при malloc трябва и конструктора да викаш на ръка...
Re: абе я и мене ме светнете за malloc
new wutreshno izpolzwa malloc(), delete free(), podobno new [], delete [] - purwo wikat po edin malloc/free za spisuka s elementi - posle za wseki element otdelno wikat malloc/free (ako class-a e slozhen).
malloc(calloc)/realloc/free sa prosto alokirane, realokirane, osvobozhdawane na pamet - po-nisko (no po-skoro - po-razlichno) nivo na new/delete.
аз съм засега върл противник на ползването на malloc - polzwash li strdup? fopen?
To err is human
To stderr is inhuman
malloc(calloc)/realloc/free sa prosto alokirane, realokirane, osvobozhdawane na pamet - po-nisko (no po-skoro - po-razlichno) nivo na new/delete.
аз съм засега върл противник на ползването на malloc - polzwash li strdup? fopen?
To err is human
To stderr is inhuman
Re: абе я и мене ме светнете за malloc
ползвяам fopen. защо? сигурен ли си че new[] вика malloc за ВСЕКИ елемент поотделно? или не съм те разбрал правилно? защото не ми се вярва - ако malloc върне памет по-голяма от заявената, а то го прави, то ще си нахендриш масива!
мен ако просто ми трябва памет, то си викам new char[] а, по-късо е, освен това е шаренко - VC го оцветява в синьо :))))))))
освен това не се сещам нещо за "просто памет" - винаги ти трябва памет от определен тип, а това изисква кастинг при malloc... а мразя кастинга, защото трябва да натискам шифт за да напиша скобите :))))))
мен ако просто ми трябва памет, то си викам new char[] а, по-късо е, освен това е шаренко - VC го оцветява в синьо :))))))))
освен това не се сещам нещо за "просто памет" - винаги ти трябва памет от определен тип, а това изисква кастинг при malloc... а мразя кастинга, защото трябва да натискам шифт за да напиша скобите :))))))
Един пример
значи new е за C++, ако ползваш C ти трябва maloc.
C ти трябва ако решиш накакви парчета да са по универсални - например искаш нещо да го трасираш под Windows а след това да го ползваш в някакво embeded приложение (за 8051 процесор).
Въпреки че не съм съвсем прав.
Решиш ли да пишеш за такива процесори обикновено гледаш да минеш без динамично алокиране
Аз поне не съм имал случай да не мога да мина или със 'статично' алокиране или с new/delete.
C ти трябва ако решиш накакви парчета да са по универсални - например искаш нещо да го трасираш под Windows а след това да го ползваш в някакво embeded приложение (за 8051 процесор).
Въпреки че не съм съвсем прав.
Решиш ли да пишеш за такива процесори обикновено гледаш да минеш без динамично алокиране
Аз поне не съм имал случай да не мога да мина или със 'статично' алокиране или с new/delete.
Re: ,ama zashto?
> string = (char*) malloc(10 * sizeof(char));
Това е правилно за всеки един тип, но за char е напълно излишно, понеже sizeof(char) е гарантирано 1, независимо колко голям е char в битове на съответната машина. А ако искаш да си алокираш битови полета, и то машинно независимо, трябва да ползваш CHAR_BIT константата.
Това е правилно за всеки един тип, но за char е напълно излишно, понеже sizeof(char) е гарантирано 1, независимо колко голям е char в битове на съответната машина. А ако искаш да си алокираш битови полета, и то машинно независимо, трябва да ползваш CHAR_BIT константата.
Re: ,ama zashto?
po princip si prav, no ne vredi.
az po princip mnogo chesto predefiniram tipovete i sled tova ne se pritesniavam, ako smenia bazovia tip
az po princip mnogo chesto predefiniram tipovete i sled tova ne se pritesniavam, ako smenia bazovia tip
imi seshtam se za edna
ako iskash da pravish realloc, t.e. dinamichno da promeniash razmera na bufera
Re: ,ama zashto?
az po princip mnogo chesto predefiniram tipovete i sled tova ne se pritesniavam, ako smenia bazovia tip
Az ne namiram tova za dobra idea, prosto zaradi fakta che drug mozhe da mi gleda sorsovete. Posledno wreme se opitwam da se durzha kum tjah (sorsovete koito pisha) kato ne moja sobstwenost a obshtestwena :) - imenno ot tam ne bih zhelal da zloupotrebjawam sus zhargona
To err is human
To stderr is inhuman
Az ne namiram tova za dobra idea, prosto zaradi fakta che drug mozhe da mi gleda sorsovete. Posledno wreme se opitwam da se durzha kum tjah (sorsovete koito pisha) kato ne moja sobstwenost a obshtestwena :) - imenno ot tam ne bih zhelal da zloupotrebjawam sus zhargona
To err is human
To stderr is inhuman
Re: ,ama zashto?
ami spored men taka sorsovete stavat dori po-pregledni, v smisal che ti rabotish s tip koito e specialno sazdaden i naimenuvan za celta.
a i po tozi nachin promianata se pravi na edno miasto a ne triabva da se preglezda celia kod.
edin savsem prost primer, promiana kam unicode
a i po tozi nachin promianata se pravi na edno miasto a ne triabva da se preglezda celia kod.
edin savsem prost primer, promiana kam unicode
Re: ,ama zashto?
> ami spored men taka sorsovete stavat dori po-pregledni, v smisal che ti rabotish s tip koito e specialno sazdaden i naimenuvan za celta.
Не става по-прегледно да вкарваш излишни неща в кода, нито пък изглежда професионално да не знаеш размера на най-фундаменталния тип. В comp.lang.c ще те изядат жив, като видят че пресмяташ дължината на char, макар и по време на компилация.
> a i po tozi nachin promianata se pravi na edno miasto a ne triabva da se preglezda celia kod.
> edin savsem prost primer, promiana kam unicode
Кой точно Unicode?
От всички стандарти най-голям шанс има UTF-8, който е с променлива дължина, тъй че няма как да му се отдели специален тип. Ако имаш предвид w_char, пиши го умрял.
char е размерът на байта на машината и се нарича така само по исторически причини, когато размерът на кода за даден символ е съвпадал с размера на байта.
Не става по-прегледно да вкарваш излишни неща в кода, нито пък изглежда професионално да не знаеш размера на най-фундаменталния тип. В comp.lang.c ще те изядат жив, като видят че пресмяташ дължината на char, макар и по време на компилация.
> a i po tozi nachin promianata se pravi na edno miasto a ne triabva da se preglezda celia kod.
> edin savsem prost primer, promiana kam unicode
Кой точно Unicode?
char е размерът на байта на машината и се нарича така само по исторически причини, когато размерът на кода за даден символ е съвпадал с размера на байта.
много добре знам какъв е размера на char
но смятам за по-правилно да натоваря компилатора с изчисления и проверки, отколкото да правя runtime проверки, да допускам двусмислия или да разчитам на неща по подразбиране. точно по тази причина слагам и повече скоби отколкото е нужно :). а comp.lang.c са ми през оная работа, както и тези от форум "софтуер", които ме изядоха жив, защото казах, че байта не винаги е 8 бита.
и накрая като закачка:
#define char double
int main(int argc, char* argv[])
{
printf("sizeof char is %u\n", sizeof(char));
}
и накрая като закачка:
#define char double
int main(int argc, char* argv[])
{
printf("sizeof char is %u\n", sizeof(char));
}
Re: много добре знам какъв е размера на char
#define char double
int main(int argc, char* argv[])
{
printf("sizeof char is %u\n", sizeof(char));
}
kato zakcahka go priemam
To err is human
To stderr is inhuman