2011-09-30 9 views

risposta

7

L'ISO/IEC 9899: stati TC2 in 6.3.2.3 Pointers

3 Una costante intera espressione con il valore 0 o un cast espressione digitare * vuoto, viene chiamato un puntatore nullo constant.55) Se un nullo costante puntatore viene convertito in un tipo di puntatore, il risultante puntatore, chiamato un puntatore nullo, è garantita per confrontare ineguale a un puntatore a qualsiasi oggetto o funzione

la NULL macro si espande a una costante puntatore nullo definita dall'implementazione.

Eventuali due puntatori nulli devono essere uguali.

6

Sì, c'è. Lo standard impone che NULL punti sempre alla memoria non valida. Ma non afferma che la rappresentazione intera del puntatore deve essere 0. Non ho mai incontrato un'implementazione per cui lo NULL era diverso da 0, ma questo non è richiesto dallo standard.

Si noti che l'assegnazione del letterale 0 a un puntatore non significa che il puntatore assume la rappresentazione intera di 0. Significa che il valore del puntatore nullo speciale è assegnato alla variabile puntatore.

+1

rilevante: http://c-faq.com/null/machexamp.html – nos

+7

Si noti inoltre che 'int * ptr = 0;' produce sempre un puntatore nullo grazie a una regola speciale, perché '0' è un la cosiddetta "costante del puntatore nullo". Questo vale anche se si è in qualche implementazione particolare in cui un puntatore nullo è diverso dall'indirizzo 0. Tuttavia, 'int i = 0; int * ptr = (int *) i; 'non risulta necessariamente in un puntatore nullo. Quindi normalmente non incontrerai "un puntatore che punta all'indirizzo 0", tranne in un contesto in cui è un puntatore nullo, ma lo standard lo consente. –

+0

@David, nel tuo secondo para intendi "non", vero? E 'NULL' è sempre un valore' 0' per definizione dello standard, che potrebbe essere un indirizzo valido, ad esempio nel kernel. Quindi si dovrebbe meglio distinguere 'NULL' più chiaramente dalla rappresentazione interna di un puntatore nullo, che, come dici tu, potrebbe essere qualcosa di diverso. –

3

La valutazione del valore letterale 0 in un contesto di puntatore è identica a NULL. Qualunque schema di bit utilizzato dal compilatore per rappresentare un puntatore NULL è nascosto.

1

La vecchia FAQ di comp.lang.c ha una grande sezione sul puntatore nullo e vale la pena leggerla.

comp.lang.c null pointers

0

L'idea è che un puntatore NULL dovrebbe in qualche modo rappresentare un'area di memoria che non è valido.
Quindi, poiché nei segmenti di memoria inferiori viene mappato il codice OS, è stato utilizzato il valore 0 (per rappresentare il puntatore NULL) poiché quest'area in memoria non appartiene al programma dell'utente ma è mappata al codice OS.