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?
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.
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
È 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.
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.