Qual è la differenza tra un puntatore che punta alla posizione 0x0 e un puntatore impostato su NULL?

10

Un puntatore punta a 0x0000 come un puntatore impostato su NULL? Se il valore NULL è definito nel linguaggio C, in quale posizione viene tradotto fisicamente? È lo stesso di 0x0000. Dove posso trovare maggiori dettagli su questi concetti?

    
posta Arpith 04.01.2012 - 15:44
fonte

4 risposte

9

Un punto in cui la maggior parte delle risposte qui non sono indirizzate, almeno non esplicitamente, è che un puntatore nullo è un valore che esiste durante l'esecuzione e una costante del puntatore nullo è un costrutto sintattico che esiste nel codice sorgente C.

Una costante del puntatore nullo , come afferma correttamente la risposta di Karlson, è un'espressione costante intera con il valore 0 (un semplice 0 è l'esempio più comune), o un cast di espressione simile a void* (come (void*)0 ).

NULL è una macro, definita in <stddef.h> e molte altre intestazioni standard, che si espande in una costante di puntatore nullo definita dall'implementazione . L'espansione è in genere 0 o ((void*)0) (le parentesi esterne sono necessarie per soddisfare altre regole linguistiche).

Quindi un valore letterale 0 , quando usato in un contesto che richiede un'espressione di tipo puntatore, sempre valuta un null pointer , cioè un valore puntatore univoco che punta a nessun oggetto. Questo non implica qualcosa sulla rappresentazione di un puntatore nullo . I puntatori nulli sono molto comunemente rappresentati come tutti-bit-zero, ma possono essere rappresentati come qualsiasi cosa. Ma anche se un puntatore nullo è rappresentato come 0xDEADBEEF , 0 o (void*)0 è ancora una costante puntatore nullo .

Questa risposta a la domanda sullo stackoverflow copre bene.

Questo implica, tra le altre cose, che memset() o calloc() , che può impostare una regione di memoria a tutto-bit-zero, non necessariamente imposterà puntatori in quella regione a puntatori nulli. È probabile che lo facciano sulla maggior parte delle implementazioni, ma la lingua non lo garantisce.

Non so perché questa domanda non è considerata un duplicato di questo , o come è attuale qui.

    
risposta data 05.01.2012 - 02:57
fonte
5

Ogni piattaforma là fuori è libera di definire NULL come preferisce.

Secondo lo standard C, se assegni zero a un puntatore verrà convertito in un valore NULL (per quella piattaforma). Tuttavia, se prendi un puntatore NULL e lo lanci su int, non ci sono garanzie che tu otterrà zero su ogni piattaforma là fuori. Il fatto comunque è che sulla maggior parte delle piattaforme sarà zero.

Informazioni su quella roba che puoi trovare in The C Language Specification . Una fonte, di cui non posso garantire l'attendibilità, è questa: link

    
risposta data 04.01.2012 - 15:48
fonte
1

È definito nel linguaggio C perché non esiste un indirizzo di macchina invariabile a cui è equiparato. Se lo facesse, non avremmo bisogno di un'astrazione da questo! Anche se sulla maggior parte delle piattaforme, NULL potrebbe essere implementato come 0 di un tipo o altro, è semplicemente sbagliato pensare che questo sia universalmente valido, se ci si preoccupa della portabilità del tutto.

    
risposta data 04.01.2012 - 15:49
fonte
0

In base alla documento C standard sezione 6.3.2.3 :

An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.55) If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.

Finora non ho visto un compilatore che si è discostato da questo.

    
risposta data 04.01.2012 - 16:05
fonte

Leggi altre domande sui tag