PDA

Visualizza la versione completa : [C/C++] Valore di NULL


KrOW
17-11-2009, 14:03
Ciao a tutti . . . Pochi giorni fa ho letto che il valore della macro NULL non è sempre 0 ma puo assumere anche altri valori (ad esempio su alcuni sistemi è definito con il valore -1 ). Ora la mia domanda è: E' vero ???
No perchè io, quando devo verificare se un puntatore punta a qualcosa, ho l' abitudine di trattare il puntatore come un bool invece che comparare il puntatore con NULL ovvero utilizzo questa espressione

if ( pointer )
al posto di quest' altra

if ( pointer != NULL )
Quindi, se quel che ho letto è vero , dovrei abituarmi a usare la seconda notazione per rendere il codice portabile (anche se per ora programmo su un solo sistema, ma non si mai) o mi sbaglio???

MItaly
17-11-2009, 14:22
Avendo sempre lavorato su Windows e Linux su architetture x86 e x86_64 non ho mai visto NULL definito a valori differenti da 0, tuttavia quello che dici è vero, tecnicamente NULL può essere definito come qualunque valore. Per questo anch'io mi sono abituato ad usare la seconda notazione che hai scritto, che ha anche il vantaggio di rendere subito chiaro che si sta lavorando su un puntatore, e non su un intero, un booleano o qualunque altro tipo.

oregon
17-11-2009, 14:28
Mah ... personalmente non credo che la NULL possa essere diversa da 0 in quanto e' il valore che e' stato scelto dai produttori di hardware come indirizzo non accedibile (per cui le CPU generano una exception).

Non penso sia una buona idea cambiarne il significato ...

MItaly
17-11-2009, 14:56
Originariamente inviato da oregon
Mah ... personalmente non credo che la NULL possa essere diversa da 0 in quanto e' il valore che e' stato scelto dai produttori di hardware come indirizzo non accessibile (per cui le CPU generano una exception).
Io ho sempre saputo che sui sistemi dotati di memoria virtuale le eccezioni di memoria dipendono da come il sistema operativo stabilisce che debba essere lo spazio di indirizzi virtuale del processo; nello specifico, Windows ad esempio stabilisce che i primi 64 KB di memoria sono inaccessibili, ed è per questo che qualunque tentativo di accedere a memoria tra 0x00000000 e 0x00010000 genera un'eccezione hardware di protezione della memoria. Se ben ricordo quanto ho studiato sul Tanenbaum, in generale il sistema operativo per definire una zona di memoria non accessibile deve semplicemente sollevare un'eccezione di memoria nel gestore dei page fault quando vede che l'indirizzo appartiene ad una zona protetta.

KrOW
17-11-2009, 17:40
Siccome utilizzo una notazione simil ungara, non ho problemi nel riconoscere il tipo di dato, però se c' è una possibità (seppur minima da quel che ho capito) che il null pointer sia un valore diverso da 0, è meglio comparare un puntatore con NULL che trattarlo come un bool . . . grazie mille

XWolverineX
17-11-2009, 18:17
#define NULL ((void*)0)

MItaly
17-11-2009, 18:33
Originariamente inviato da KrOW
Siccome utilizzo una notazione simil ungara,
Ungherese, intendi? Quella capace di rendere illeggibile qualunque blocco di codice, anche il più semplice? :mame:


non ho problemi nel riconoscere il tipo di dato, però se c' è una possibità (seppur minima da quel che ho capito) che il null pointer sia un valore diverso da 0, è meglio comparare un puntatore con NULL che trattarlo come un bool . . .
In generale si tratta più di un problema di chiarezza e correttezza semantica.


Originariamente inviato da XWolverineX
#define NULL ((void*)0)
Questa vale solo in C, in C++ la questione è più complicata, dal momento che un void * andrebbe castato esplicitamente al tipo del puntatore con cui si effettua il confronto, per cui si è utilizzato per un po' il semplice zero, e ora finalmente hanno deciso di usare nullptr (un po' di spiegazioni a proposito (http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/nullptr)).

MItaly
17-11-2009, 18:42
Ecco, trovato; secondo il Rector-Newcomer (Win32 programming, Addison-Wesley, 1997, pagg. 31-32), che a sua volta cita lo standard C, "[The macro] NULL expands to an implementation-defined null pointer constant".

Alex'87
17-11-2009, 19:37
Originariamente inviato da MItaly
per cui si è utilizzato per un po' il semplice zero, e ora finalmente hanno deciso di usare nullptr (un po' di spiegazioni a proposito (http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/nullptr)). Grazie del link, molto interessante ;)

MItaly
17-11-2009, 19:43
Prego, di nulla! :ciauz:

Loading