Un puntatore che punta a 0x0000 è uguale a un puntatore impostato su NULL? Se il valore NULL è definito nel linguaggio C, in quale posizione viene tradotto fisicamente? È uguale a 0x0000. Dove posso trovare maggiori dettagli su questi concetti?
Un puntatore che punta a 0x0000 è uguale a un puntatore impostato su NULL? Se il valore NULL è definito nel linguaggio C, in quale posizione viene tradotto fisicamente? È uguale a 0x0000. Dove posso trovare maggiori dettagli su questi concetti?
Risposte:
Un punto che la maggior parte delle risposte qui non si rivolge, almeno non esplicitamente, è che un puntatore null è un valore esistente durante l'esecuzione e una costante puntatore null è un costrutto sintattico che esiste nel codice sorgente C.
Una costante puntatore null , come afferma correttamente la risposta di Karlson, è o un'espressione di costante intera con il valore 0 (un semplice 0
è l'esempio più comune) o un'espressione simile lanciata su void*
(come (void*)0
).
NULL
è una macro, definita in <stddef.h>
e diverse altre intestazioni standard, che si espande in una costante puntatore null definita dall'implementazione . L'espansione è in genere o 0
o ((void*)0)
(le parentesi esterne sono necessarie per soddisfare le altre regole linguistiche).
Quindi un valore letterale 0
, se utilizzato in un contesto che richiede un'espressione di tipo puntatore, valuta semprenull pointer
un valore di puntatore univoco che non indica alcun oggetto. Ciò non implica nulla sulla rappresentazione di un puntatore nullo . I puntatori null sono molto comunemente rappresentati come all-bit-zero, ma possono essere rappresentati come qualsiasi cosa. Ma anche se un puntatore null è rappresentato come 0xDEADBEEF
, 0
o (void*)0
è ancora una costante puntatore null .
Questa risposta alla domanda su StackOverflow copre questo bene.
Ciò implica, tra l'altro, che memset()
o calloc()
, che può impostare una regione di memoria su all-bit-zero, non imposterà necessariamente alcun puntatore in quella regione su puntatori nulli. È probabile che lo facciano sulla maggior parte delle implementazioni, ma il linguaggio non lo garantisce.
Non so perché questa domanda non sia considerata un duplicato di questa , o come sia attuale qui.
NULL
o qualsiasi costante puntatore null a un oggetto puntatore imposta il valore dell'oggetto su un puntatore null . A livello di macchina, potrebbe anche indicare un pezzo di memoria valido. Dereferenziare un puntatore nullo ha un comportamento indefinito; l'accesso a un pezzo di memoria all'indirizzo 0x0000000
è un comportamento valido, come letteralmente qualsiasi altra cosa. Tale indirizzo differisce da qualsiasi altro indirizzo per (a) confronto uguale a NULL
, e (b) confronto disuguale con qualsiasi puntatore a un oggetto C. Un puntatore nullo è un valore di puntatore arbitrario utilizzato per indicare che non punta a nulla.
Ogni piattaforma là fuori è libera di definire NULL a proprio piacimento.
Secondo lo standard C, se si assegna zero a un puntatore, questo verrà convertito in un valore NULL (per quella piattaforma.) Tuttavia, se si prende un puntatore NULL e lo si lancia in int, non ci sono garanzie che si otterrà zero su ogni piattaforma là fuori. Il fatto è tuttavia che sulla maggior parte delle piattaforme sarà zero.
Informazioni su quella roba si può trovare in linguaggio C Specification . Una fonte, la cui affidabilità non posso garantire, è questa: http://www.winapi.co.kr/pds/doc/ISO-C-FDIS.1999-04.pdf
NULL pointer constant
. Per quanto ne so non ci sono compilatori là fuori che lo fanno.
NULL
macro, che deve espandersi 0
in C ++ e in 0
o (void *)0
in C, perché questa è la vera "costante puntatore null".
È definito nel linguaggio C perché non esiste un indirizzo macchina invariabile a cui corrisponda. Se così fosse, non avremmo bisogno di un'astrazione da esso! Anche se sulla maggior parte delle piattaforme, NULL potrebbe alla fine essere implementato come 0 di un tipo o altro, è semplicemente errato supporre che sia universalmente così, se ti interessa la portabilità.
Secondo la sezione del documento standard C6.3.2.3
:
Un'espressione di costante intera con il valore 0, o un'espressione simile lanciata per digitare void *, viene chiamata costante di puntatore null.55) Se una costante di puntatore null viene convertita in un tipo di puntatore, il puntatore risultante, chiamato puntatore null, è garantito per confrontare ineguali con un puntatore a qualsiasi oggetto o funzione.
Finora non ho visto un compilatore che si è separato da questo.