[ Paxy @ 12.05.2004. 11:17 ] @
Evo jednog zanimljivog pitanja !!! Da li NULL mora uvek biti na adresi 0 u memoriskom prostoru ? Da li je uvek tako u svim uredjajima, svim sistemima, svim programskim jezicima ? |
[ Paxy @ 12.05.2004. 11:17 ] @
[ byTer @ 12.05.2004. 13:08 ] @
NULL nije nula vec je vrednost izraza za praznu varijablu. Znaci nije ni 0 ni '' vec samo null (nil u C-u).
[ caboom @ 12.05.2004. 13:15 ] @
po standardima:
#define NULL ((void *)0) [ DDMM @ 17.05.2004. 15:23 ] @
ISO-IEC 9899--1999 (E) 7.17/3 The macros are NULL which expands to an implementation-defined null pointer constant; ISO-IEC-14882--1998 4.10/1 A null pointer constant is an integral constant expression (5.19) rvalue of integer type that evaluates to zero; [ ***ArChAnGeL*** @ 18.05.2004. 02:37 ] @
NULL uglavnom ima vrednost 0.Mada po standardu C-a to nije obavezno pravilo pa se moze reci da zavisi od kompajlera.
U svakom slucaju poredjenje poentera sa nulom nije preporucljivo (radi ali i nemora uvek) Vec jednostavno poredi sa NULL i ne razbijaj glavu sta je razvojni tim kompajlera utripovao. [ srki @ 18.05.2004. 02:52 ] @
Citat: ***ArChAnGeL***: NULL uglavnom ima vrednost 0.Mada po standardu C-a to nije obavezno pravilo pa se moze reci da zavisi od kompajlera. Po standardu C-a to je obavezno pravilo! Ako kompajler prati standarde svuda mozes da pises 0 umesto NULL ako hoces. http://www.eskimo.com/~scs/C-faq/q5.10.html Citat: No. (Using NULL may be preferable, but not for this reason.) Although symbolic constants are often used in place of numbers because the numbers might change, this is not the reason that NULL is used in place of 0. Once again, the language guarantees that source-code 0's (in pointer contexts) generate null pointers. NULL is used only as a stylistic convention. [ DDMM @ 18.05.2004. 12:43 ] @
Citat: Po standardu C-a to je obavezno pravilo! Ako kompajler prati standarde svuda mozes da pises 0 umesto NULL ako hoces. Netacno. Citiraj standard kao sto sam ja. Citat: No. (Using NULL may be preferable, ... Ne pise nigde u STANDARD-u. Takav faq mogu i ja da napisem. ALI... Standard za C ( ISO-IEC-9899--1999 ) je jasan: Citat: ISO-IEC 9899--1999 (E) 7.17/3 The macros are NULL which expands to an implementation-defined null pointer constant; Za C++ takodje: Citat: ISO-IEC-14882--1998 4.10/1 A null pointer constant is an integral constant expression (5.19) rvalue of integer type that evaluates to zero; [ srki @ 18.05.2004. 20:29 ] @
Citat: e pise nigde u STANDARD-u. Kako ne pise? Citat: Takav faq mogu i ja da napisem. Faq je odlican. Verovatno najpoznatiji c faq. Ne znam sto si ovo rekao. Citat: A null pointer constant is an integral constant expression (5.19) rvalue of integer type that evaluates to zero; Pa zar nisam ja to rekao? Uvek mozes null konstantu da zamenis sa 0 jer je to isto. Da nije tako onda ovi izrazi ne bi bili legalni: if(p){} if(p==0) {} Citat: iso9899: 6.3.2.3 Pointers An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant. Znaci moze i integer konstanta nula, ne mora da bude kastovano. Da mora, oni izrazi sto sam naveo ne bi bili u redu. Po standardu pointer uvek mozes da poredis sa nulom. Takodje, Citat: ansi_iso_iec_14882_1998 73. strana, odeljak 5.2.10 na dnu pise "converting an integral constant expression with value zero always yield a null pointer, but converting other expressions that happen to have value zero not yield a null pointer." [ DDMM @ 19.05.2004. 14:19 ] @
Standard kaze da NULL ne mora da bude adresa nula,
ali pri konverziji u int dobijas nulu. To sto vecina kompajlera forsira da je NULL nulta adresa je da bi konverzija bila brza. Na nekim sistemima int i pointer se "tretiraju" kao jedno te isto. Kad poredis pointer i nulu, nulu kompajler posmatra kao int. Pa imas konverzije iz nule( tip int) u NULL( tip pointer) da bi poredjenje moglo da bude izvrseno. itd. [ srki @ 20.05.2004. 14:24 ] @
Citat: Standard kaze da NULL ne mora da bude adresa nula, ali pri konverziji u int dobijas nulu. Netacno, standard kaze da je NULL integralna konstanta sa vrednoscu nula. Pa ti si sam to citirao: Citat: A null pointer constant is an integral constant expression (5.19) rvalue of integer type that evaluates to zero Citat: Kad poredis pointer i nulu, nulu kompajler posmatra kao int. Netacno. Nulu kompajler predstavlja kao null pointer pri poredjenju sa pointerom. Recimo ne mozes promenjivu tipa int koju ima vrednost nula da poredis sa pointerom i da tako gledas da li je to null pointer. To nije portabilno i nije po standardu. To i pise jednom od gornjih citata. [ DDMM @ 21.05.2004. 11:38 ] @
srki objasni ovo:
Citat: ISO-IEC 9899--1999 (E) 7.17/3 The macros are NULL which expands to an implementation-defined null pointer constant; Citiram tebe: Citat: iso9899: 6.3.2.3 Pointers An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant. Znaci ovo je legalno: Code: void *p; const int a=10, b=10; // ... // ... if( p !=( a-b ) ) {/*...*/} if( p !=(int)0 ) {/*...*/} if( p !=(24-24) ) {/*...*/} [ srki @ 21.05.2004. 14:00 ] @
Ono prvo nije legalno ali drugo i trece jeste legalno.
Zasto ono prvo nije? Zato sto kompajler ne zna da li je a-b jednako nuli. To ti se vidi u toku izvrsavanja programa. Tu ono const samo znaci da promenjive a i b ne smes da menjas ali kompajler ne posmatra njihove vrednosti i ne zna koje su njihove vrednosti prilikom racunanja izraza a-b. To ti program izracuna u toku rada. Da si stavio #define onda bi radilo. U izrazu "An integer constant expression with the value 0" ono integer constant expression se odnosi na izraz koji je konstanta prilikom kompajliranja. Recimo (2*3-1-1-2*2) Fora je sto ce i prvi slucaj da ti radi na windowsu jer null pointer ima vrednost nula ali ti nece raditi na nekim masinama gde null pointer nema vrednost nula. Citat: srki objasni ovo: ISO-IEC 9899--1999 (E) 7.17/3 The macros are NULL which expands to an implementation-defined null pointer constant; Da, ali je standardom definisano i null pointer constant (to si ti prvi put citirao) 4.10 A null pointer constant is an integral constant expression rvalue of integer type that evaluates to zero. Znaci 0, 2-2, 5*5-25 itd.... Onaj faq je zaista super. Ja znam da sam ga jos odavno procitao celog makar dvaput. [ -=k3rn3l=- @ 21.05.2004. 16:47 ] @
Ja ne razumem zasto tolike polemike. NULL ili NiL nije isto kao i vrednost 0.
A value that means, "a value is not applicable" or "the value is unknown". Nulls are not equal to any specific value, even to each other. [ srki @ 22.05.2004. 07:47 ] @
NULL jeste isto sto i 0. Svuda gde ti pise NULL mozes da zamenis sa 0.
[ -=k3rn3l=- @ 22.05.2004. 18:56 ] @
Pa cekaj jeste malo konfuzno pogotovu kada programirate ali opet ponavljam
A value that means, "a value is not applicable" or "the value is unknown". Nulls are not equal to any specific value, even to each other. [ srki @ 23.05.2004. 15:06 ] @
U toj recenici se pod Null-om podrazumeva Null pointer a ne NULL konstanta. NULL konstanta je isto sto i nula (#define NULL 0) a kada recimo stavis p=0 kompajler kada vidi sa desne strane nulu onda ce p da postavi da bude null pointer cija vrednost zavisi od operativnog sistema i procesora. Moze cak biti i vise vrednosti null pointera. Tebe to ne treba da interesuje. Obicno je vrednost null pointera nula ali ne mora da znaci! Ali koja god da je vrednost ti kada uradis p=0 ili p=NULL kompajler ce da postavi p na pravu vrednost.
Malo jasnije? [ byTer @ 23.05.2004. 20:26 ] @
A najnovije u delphiju Null je funkcija.
[ DDMM @ 31.05.2004. 10:59 ] @
srki:
Citat: Obicno je vrednost null pointera nula ali ne mora da znaci! Ali koja god da je vrednost ti kada uradis p=0 ili p=NULL kompajler ce da postavi p na pravu vrednost. Pa ovo pricam i ponavljam. [ Reljam @ 31.05.2004. 11:12 ] @
U praksi NULL je 0, cisto sumnjam da postoji i jedan kompajler (koji se koristi :)) gde to nije tako. Ako nista drugo, gomila koda koja implicitno ili cak eksplicitno ocekuje da je NULL 0 ne bi radila.
[ caboom @ 31.05.2004. 12:32 ] @
jos jednom grep resava velike misterije covecanstva:
1) GCC #undef NULL #if defined (__cplusplus) #define NULL 0 #else #define NULL ((void *) 0) #endif 2) MS VCPP VS2003 #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif 3) Intel CPP #ifndef NULL #define NULL _NULL #endif ..... #define _NULL 0 [ DDMM @ 01.06.2004. 10:47 ] @
Code: void f(int x) { cout <<"int" << endl; } void f(char* c) { cout <<"pointer" << endl; } f( NULL ); //A ja 'teo f(char* c); 10x 2 Julijan Sribar. [ srki @ 07.06.2004. 15:56 ] @
Citat: DDMM: Citat: srki: Obicno je vrednost null pointera nula ali ne mora da znaci! Ali koja god da je vrednost ti kada uradis p=0 ili p=NULL kompajler ce da postavi p na pravu vrednost. Pa ovo pricam i ponavljam. Ne, ti nisi to pricao. Ti si pricao da ne mora da znaci da je konstanta NULL nula a u C++ standardu kaze da mora da bude nula. Citat: ISO-IEC-14882--1998 4.10/1 A null pointer constant is an integral constant expression (5.19) rvalue of integer type that evaluates to zero Ti si izgledao mesao NULL konstantu (null pointer constant) i null pointer kada si pisao svoje odgovore pa si zato pisao da NULL ne mora da bude nula. Po C++ standardu null pointer ne mora da bude nula ali NULL mora da bude nula. Kada pisem NULL to je onda null konstanta a ne null pointer. Problem je sto mnogi ne razlikuju null pointer constant i null pointer. P.S. Sto se ova tema ne prebaci u C++ forum? To mora da uradi neki smod jer su moderatori ovog foruma neaktivni. [ sspasic @ 07.06.2004. 18:15 ] @
Mislim da je pitanje šta znači 'NULL je 0'.
Ako je #define NULL 0 ili #define NULL ((void *)0) u iskazu a = NULL i a == NULL postoji konverzija celobrojne konstante 0 u null pointer koja se izvrši u vreme kompajliranja. a ne mora da bude 0 kada pogledate koju vrednost (bitove) ima memorijska lokacija u kojoj je zapisana promenljiva a. U praksi je uglavnom 0, ali mislim da sam pročitao da postoji bar jedna arhitektura gde to nije slučaj (na žalost ne mogu da se setim koja i gde sam pročitao). I čini mi se da se formulacija menjala sa različitim C/C++ standardima. [ caboom @ 07.06.2004. 19:27 ] @
rekao bih da je ova tema otisla prilicno offtopic, iako je u sustini zanimljiva. NULL macro je u sustini uveden najvise iz stilskih razloga i kao takav se zadrzao jos mnogo posle 1-og izdanja C programming language-a (K&R), uz neizbeznu standardizaciju.
ako se vec potegla standardna C/C++ diskusija sa topic-om "ciji standard je veci" mislim da bi ona mogla kulturno da stane na ove 2 tacke: 1) C99 standardu korespondira: #define NULL ((void *)0) 2) C++98 standardu korespondira: #define NULL 0 ja zaista nisam video drugacije zapise ovih makroa (u skladu sa standardima) i bilo bi lepo da neko iznese drugaciji primer na standardnim arhitekturama. Citat: sspasic: U praksi je uglavnom 0, ali mislim da sam pročitao da postoji bar jedna arhitektura gde to nije slučaj (na žalost ne mogu da se setim koja i gde sam pročitao). ovo je tacno u slucajevima prime, cdc cyber i honeywell-bull mainframe-ova i simbolickih lisp masina (koje zbog prirode arhitekture i nisu imale konvencionalne numericke pointere). [Ovu poruku je menjao caboom dana 08.06.2004. u 03:32 GMT] [ caboom @ 07.06.2004. 21:22 ] @
zaboravio sam takodje da je u slucaju arhitekture koja nema zero bit pattern kao null pointer kompajler odgovoran da prevede isti u odgovarajuci format. bla, bla... uostalom sigurno ima relevantnijih informacija na guglu.
[ NastyBoy @ 07.06.2004. 21:36 ] @
U knjizi "More C++ Gems" postoji izvanredan chlanak bash na ovu temu :
"Much Ado About NULL". Slichan chlanak je Herb Sutter objavio u CUJ-u. Veoma interesantno shtivo :) [ caboom @ 08.06.2004. 01:47 ] @
Citat: DDMM: Code: void f(int x) { cout <<"int" << endl; } void f(char* c) { cout <<"pointer" << endl; } f( NULL ); //A ja 'teo f(char* c); ovo mi je nekako promaklo... posto sam koNJpajler u sustini zaduzen za prevodjenje null pointer-a tokom samog kompajliranja (a ne u runtime-u) ovde je sasvim validan potez npr: Code: f((char *)NULL); prljavo, zar ne? ali radi... Citat: NastyBoy:U knjizi "More C++ Gems" postoji izvanredan chlanak bash na ovu temu : "Much Ado About NULL". Slichan chlanak je Herb Sutter objavio u CUJ-u. Veoma interesantno shtivo :) zavisi kako i sa koje strane gledas. ako treba da implementiras null pointere pri samom kompajleru uopste nije naivno. danas manje-vise sve nove arhitekture imaju zero null pointer, ali da npr. treba to da implementiras za matore cdc cyber-e koji imaju valjda beshe 48-mo bitne pointere koji se sastoje od ring-a, segmenta i offseta, pri cemu se programi u userspace-u vrte u ring-u 11, to bi znacilo da ti je null pointer za user-space programe 0xB0..0. zar nije charobno... elem, slazem se da sa stanovista npr. high-level programera koji dizajnira bizmis aplikacije to predstavlja apsolutno nebitan podatak, ali ova tema je prvobitno zapoceta u "kernel i OS programiranju" tako da nekome ovako nesto moze da bude i interesantno stivo. ako gledamo ovo sa stanovista kernel programiranja (osim u retkim slucajevima gde postoje odr. varijante embedded c++-a (obicno strip-ovani cpp, npr. nema visestrukog nasledjivanja, etc.)) vratio bih se na moj prvi odgovor: #define ((void *)0) NULL Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|