Question

Je travaille sur un projet et je continue à venir à travers cette erreur qui ne me permet pas de terminer le projet. Quand j'initialise un de mes pointeurs pour pointer vers un objet qui sera faite lors de l'exécution du programme et je l'initialiser à NULL. Puis, quand je vérifie pour voir ce qu'il est réglé sur elle retourne une valeur de nil. Comment est-ce possible? Je ne croyais pas que les pointeurs nuls existaient en C. Y at-il moyen de contourner cela?

struct order_line *front = NULL;
...
printf("Head: %p\n", front);  // prints -> Head: (nil)
Était-ce utile?

La solution

%p dans printf formats d'un type de pointeur. Cela va distinguer un pointeur NULL et imprimer (nil) parce qu'il est une valeur particulière dans le contexte d'un pointeur. Si vous voulez afficher 0 pour un pointeur NULL, lancer le pointeur sur un entier et l'utilisation %d à la place:

printf("Head: %d\n", (int) front);

Réponse originale car il peut encore être utile:

NULL est une macro définie comme 0 ou ((void *) 0), donc si vous définissez un pointeur sur NULL c'est exactement la même chose que lui à 0. Cela fonctionne pour la purposed de déclarer des pointeurs nuls parce que la mémoire à l'adresse 0 ne sera jamais affecté à votre programme.

Autres conseils

Lorsque vous imprimez un pointeur à l'aide printf("%p", somePtr), il est imprimé dans une de manière définie par l'implémentation , selon cette citation de la spécification printf POSIX (libellé similaire existe dans la spécification C99 aussi).

  

L'argument doit être un pointeur vers vide. La valeur du pointeur est converti en une séquence de caractères à imprimer, d'une manière dépendant de l'implémentation.

Je suppose que cela signifie que si le pointeur est NULL, il peut l'imprimer mais il veut, y compris l'impression comme nil ou 0x00000000 ou 0.

utilisation

printf("Head: %s, %d, %p\n", front, front, front);

pour imprimer Head: (null), 0, (nil)

Merci Packia

Je suppose que nul est ce que votre débogueur vous dit. Dans la plupart des compilateurs nul est juste ed #define à 0 de toute façon si ce nom n'est pas important.

Comme d'autres l'ont dit, il n'y a pas une telle chose comme pointeur nul en C.

Peut être votre allocation de mémoire échoue, ce qui 0 à affecter au pointeur.

Si votre question porte sur la comparaison de la valeur de pointeur NULL à la valeur imprimée par printf () ne devrait pas importer. Vous pouvez toujours faire if (PTR == NULL) pour cela.

    ptr = (néant) et NULL = (néant) => NULL ptr =:)

L'erreur que vous obtenez doit en raison d'une autre raison.

Après avoir jeté le pointeur de la structure avec int, il fournit l'état prévu avec instruction 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);
}

SORTIE: -

L'adresse de la variable est --- PS-> p --- Après Deletion-- nul L'adresse de la variable est --- PS-> p --- Après Deletion-- 0

il sera évaluée à false pour si la condition.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top