(Zero) puntatore in C / C ++
-
13-10-2019 - |
Domanda
Sto lavorando su un progetto e io continuo a in questo errore che non mi permetterà di completare il progetto. Quando ho inizializzo uno dei miei puntatori per puntare a un oggetto che verrà effettuato durante l'esecuzione del programma e ho inizializzarlo a NULL
. Poi quando controllo per vedere che cosa è impostato ad esso restituisce un valore di nil
. Come è una cosa possibile? Non credevo che i puntatori nulli esistevano in C. C'è un modo per aggirare questo?
struct order_line *front = NULL;
...
printf("Head: %p\n", front); // prints -> Head: (nil)
Soluzione
%p
in printf
formatta un tipo di puntatore. Questo sta per distinguere un null-pointer e stampare (nil)
perché è un valore speciale nel contesto di un puntatore. Se si vuole l'uscita 0 per un puntatore nullo, il cast del puntatore ad un %d
intero e l'uso invece:
printf("Head: %d\n", (int) front);
Risposta originale in quanto può essere ancora utile:
NULL
è una macro definita come 0
o ((void *) 0)
, quindi se si imposta un puntatore ad NULL
è esattamente la stessa di impostandolo a 0
. Questo funziona per il proposto di dichiarare puntatori nulli perché la memoria all'indirizzo 0 non sarà mai assegnato al vostro programma.
Altri suggerimenti
Quando si stampa un puntatore usando printf("%p", somePtr)
, è stampato in un implementazione definita modo , come da questa citazione dal POSIX printf specifica (simile formulazione esiste nella specifica C99 anche).
L'argomento deve essere un puntatore a vuoto. Il valore del puntatore viene convertito in una sequenza di caratteri stampabili, in modo dipendente dall'implementazione.
Credo che questo mezzo, se il puntatore è NULL
, può stamparlo come vuole, tra cui la stampa come nil
o 0x00000000
o 0
.
utilizzo
printf("Head: %s, %d, %p\n", front, front, front);
per stampare Head: (null), 0, (nil)
Grazie Packia
Sto assumendo che nulla è ciò che il vostro debugger ti sta dicendo. Nella maggior parte dei compilatori nulla è solo ed #define a 0 in ogni caso in modo che il nome non è così importante.
Come altri hanno detto, non esiste una cosa come puntatore nullo in C.
Può essere la vostra allocazione di memoria non riesce, causando 0
da assegnare al puntatore.
Se la domanda riguarda confrontando il valore del puntatore a NULL allora il valore stampato da printf () non dovrebbe importare. Si può ancora fare se (PTR == null) per questo.
- ptr = (zero) e NULL = (zero) => ptr = NULL:)
L'errore che si stanno ottenendo must a causa di qualche altra ragione.
Dopo la fusione il puntatore struttura a int, fornisce la condizione previsto con if ..
printf("The address of the variable is---ps->p---After Deletion-- %p \n",ps->p);
printf("The address of the variable is---ps->p---After Deletion-- %d \n",(int)ps->p);
if((int)ps->p){
printf("Again in Free\n");
doFree((void **)&ps->p);
}
USCITA: -
L'indirizzo della variabile è --- PS-> p --- Dopo Deletion-- nil L'indirizzo della variabile è --- PS-> p --- Dopo Deletion-- 0
lo farà restituisce false per se la condizione.