,ama zashto?

15 отговора 542 прегледа
#1

,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*));

Отговор
в отговор на moqmilost #2

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
Отговор
в отговор на moqmilost #3

Re: ,ama zashto?

string = (char*) malloc(10 * sizeof(char));

Отговор
в отговор на moqmilost #4

абе я и мене ме светнете за malloc

за какъв чеп се ползва malloc, вместо new?
аз съм засега върл противник на ползването на malloc и ако не посочите някаква сериозна кирия такъв ще си и остана. освен това при malloc трябва и конструктора да викаш на ръка...

Отговор
в отговор на zaphod #5

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
Отговор
в отговор на malkia #6

Re: абе я и мене ме светнете за malloc

ползвяам fopen. защо? сигурен ли си че new[] вика malloc за ВСЕКИ елемент поотделно? или не съм те разбрал правилно? защото не ми се вярва - ако malloc върне памет по-голяма от заявената, а то го прави, то ще си нахендриш масива!
мен ако просто ми трябва памет, то си викам new char[] а, по-късо е, освен това е шаренко - VC го оцветява в синьо :))))))))
освен това не се сещам нещо за "просто памет" - винаги ти трябва памет от определен тип, а това изисква кастинг при malloc... а мразя кастинга, защото трябва да натискам шифт за да напиша скобите :))))))

Отговор
в отговор на zaphod #7

Един пример

значи new е за C++, ако ползваш C ти трябва maloc.
C ти трябва ако решиш накакви парчета да са по универсални - например искаш нещо да го трасираш под Windows а след това да го ползваш в някакво embeded приложение (за 8051 процесор).
Въпреки че не съм съвсем прав.
Решиш ли да пишеш за такива процесори обикновено гледаш да минеш без динамично алокиране
Аз поне не съм имал случай да не мога да мина или със 'статично' алокиране или с new/delete.

Отговор
в отговор на Плaмeн #8

Re: ,ama zashto?

> string = (char*) malloc(10 * sizeof(char));

Това е правилно за всеки един тип, но за char е напълно излишно, понеже sizeof(char) е гарантирано 1, независимо колко голям е char в битове на съответната машина. А ако искаш да си алокираш битови полета, и то машинно независимо, трябва да ползваш CHAR_BIT константата.

Отговор
в отговор на hoopla #9

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

Отговор
в отговор на zaphod #10

imi seshtam se za edna

ako iskash da pravish realloc, t.e. dinamichno da promeniash razmera na bufera

Отговор
в отговор на Плaмeн #11

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
Отговор
в отговор на malkia #12

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мeн #13

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 е размерът на байта на машината и се нарича така само по исторически причини, когато размерът на кода за даден символ е съвпадал с размера на байта.

Отговор
в отговор на hoopla #14

много добре знам какъв е размера на char

но смятам за по-правилно да натоваря компилатора с изчисления и проверки, отколкото да правя runtime проверки, да допускам двусмислия или да разчитам на неща по подразбиране. точно по тази причина слагам и повече скоби отколкото е нужно :). а comp.lang.c са ми през оная работа, както и тези от форум "софтуер", които ме изядоха жив, защото казах, че байта не винаги е 8 бита.


и накрая като закачка:

#define char double
int main(int argc, char* argv[])
{
printf("sizeof char is %u\n", sizeof(char));
}

Отговор
в отговор на Плaмeн #15

Re: много добре знам какъв е размера на char


#define char double
int main(int argc, char* argv[])
{
printf("sizeof char is %u\n", sizeof(char));
}


kato zakcahka go priemam , no tova e seriozno losh kod - wse edno grupa hlapeta da si izobretjat tehen dialekt kojto izpolzwa realni dumi s drugi znachinia - kolkoto da ne gi razbirat ostanalite. W smisul OBSFUCATED koda ne prechi na kompilatora da se kompilira, prechi na tozi kojto eventualno shte go chete ili poddurzha da go razbere.

To err is human
To stderr is inhuman
Отговор
в отговор на malkia #16

Re: много добре знам какъв е размера на char

тука съм 100% съгласен с тебе :)

Отговор