Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
manutara
Založen: 02. 01. 2012 Příspěvky: 81 Bydliště: Kosice SVK
|
Zaslal: 13. červenec 2012, 13:35:37 Předmět: oprava |
|
|
citace: |
to je pravda, ale napr.kód:
if((tag1->type_name=malloc(sizeof(char)*size_name*20))==NULL){
printf("\nerror -> malloc() for type_name\n");
}
printf("\nnoerror -> malloc() for type_name\n");
na vypise jekód:
noerror -> malloc() for type_name
a program padne, cize ked alokujem 20GB pamate.
na druhej stranekód:
if((tag1->type_name=malloc(sizeof(char)*size_name*2))==NULL){
printf("\nerror -> malloc() for type_name\n");
}
printf("\nnoerror -> malloc() for type_name\n");
na vypise jekód:
error -> malloc() for type_name !!!!!!!!!
noerror -> malloc() for type_name
a program skonci korenktne bez padu. v tomto pripade alokujem len 2GB pamate. |
sa ospravedlnujem za neskutocnu chybu ktora je v tomto kode.
pre vysvetlenie: pisem, ze ked alokujem 20GB pamate tak malloc()
nevracia NULL a teda, ze vraj je mozne alokovat nasobky fyzickej
RAM s nemoznostou si to kontrolovat. to nieje tak celkom pravda.
pri pohlade na malloc(), si malloc() berie ako argument pocet velkosti
``size_t'' co je v mojom pripade 4bajtove slovo. problem je v pocte.
sizeof(char)*size_name*20) nieje 20GB dat, ale 0B dat. ono sa to cislo
vlastne do size_t nezmesti a teda alokujem 0B. alokovat 0B je mozne,
podla msdn malloc(0) alokuje ``zero-length'' prvok na halde a odovzda
``PLATNY'' ukazovatel. ukazovatel je platny len dlzka alokovanej pamate
je 0B.
z tohto potom vypliva, ze malloc() vracia stale bud platny ukazovatel, alebo
NULL a teda je v kazdom pripade mozne, podla mna aj nutne, testovat
navratovu hodnotu z malloc(). _________________ hadam to OpenGL este par rokov prezije |
|
Návrat nahoru |
|
|
Vilem Otte
Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 13. červenec 2012, 13:48:56 Předmět: |
|
|
citace: |
u 64bit systemu jsou to proste 4GB - vic stejne nelze ve 32bit adresovem prostoru aplikace adresovat |
Asi se jedná o překlep a měl jsi na mysli u "32bit systému jsou to prostě 4GB". Jelikož v 64bit systému mohu klidně zavolat malloc(1024 * 1024 * 1024 *16 * sizeof(char)) a bez problému mi malloc vrací korektní adresu. _________________ Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration. |
|
Návrat nahoru |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 13. červenec 2012, 14:26:12 Předmět: |
|
|
Vilem Otte napsal: |
citace: |
u 64bit systemu jsou to proste 4GB - vic stejne nelze ve 32bit adresovem prostoru aplikace adresovat |
Asi se jedná o překlep a měl jsi na mysli u "32bit systému jsou to prostě 4GB". Jelikož v 64bit systému mohu klidně zavolat malloc(1024 * 1024 * 1024 *16 * sizeof(char)) a bez problému mi malloc vrací korektní adresu. |
ja bych doporucil cist co pisu - jasne jsem psal ze limit je 4GB pro 64bit system a v nem bezici 32bit aplikaci - ja se nebavil ani omylem o 64bit aplikacich! - cely post je LARGE_ADDRESS_AWARE a to se 64bit aplikaci netyka ... |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 13. červenec 2012, 14:54:15 Předmět: |
|
|
ako hovorim testovat na NULL je dost zbytocne ako mozete vidiet podarilo sa mi alokovat 30 TB takze moj program bude zostrleny akonahle sa rozhodnem tuto pamet vyuzit.
http://i.imgur.com/ieELA.png
BTW alokoval som 300000@100MB bloky. skutocnej RAM to zabralo priblizne 4GB co pripisujem OS overheadu. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
manutara
Založen: 02. 01. 2012 Příspěvky: 81 Bydliště: Kosice SVK
|
Zaslal: 13. červenec 2012, 15:53:39 Předmět: 13TB |
|
|
-> nou
pokial ide o 64bit system, nejaky linux to asi bude (alebo bsd atd.) podla
screenshot-u. je to mozne. na viacerych forach po nete sa povaluju
informacie a maximalnej alokovatelnej pamati. tak matne si spominam,
ze ista distribucia linuxu (64bit) umoznnuje alokovat v principe ``lubovolne''
velky blok pamate (mozno aj nekonecno hehe) nehadam sa, je to mozne
ved na tom obrazku to vidiet.
nicmene ja robim pod win (64bit), ale 32bit aplikacie cize tam je obmedzenie
velke, spomenute 4GB a testovat navratovu hodnotu z malloc() sa odporuca
a ja to tak aj robim. nestoji to vela a moje programi zatial nepadli na niecom
co je spojene so spravou pamate.
msdn `` Always check the return from malloc, even if the amount of memory
requested is small.'' _________________ hadam to OpenGL este par rokov prezije |
|
Návrat nahoru |
|
|
|