9
votes

(NIL) Pointeur en C / C ++

Je travaille sur un projet et je continue à contourner cette erreur qui ne me permettra pas de compléter le projet. Lorsque j'initialise l'un de mes indications pour indiquer à un objet qui sera effectué lors de l'exécution du programme et que je l'initialise à null . Ensuite, lorsque je vérifie pour voir ce qu'il est réglé sur elle renvoie une valeur de nil . Comment est une chose possible? Je ne croyais pas que les indicateurs de Nil existaient dans C. Y a-t-il un chemin autour de cela? xxx


6 commentaires

Comment vérifiez-vous votre valeur de pointeur? Débogueur? Printf? Cela peut simplement être un problème de représentation du pointeur NULL par votre outil.


Que signifie "nil" ici? 0? Objectif c?


J'utilise Printf (% P) pour vérifier et il est régulier C pas objectif


Pouvez-vous poster un exemple de code avec lequel le problème est reproductible?


@Chris Null Pointers fait partie intégrante de C, et certains systèmes imprimeront simplement un pointeur NULL comme "NIL" lorsque vous utilisez le spécificateur de conversion % p . Publier un code qui montre l'erreur.


Pourriez-vous expliquer si NIL est la sortie de PrintF, un message d'erreur d'exécution, un message que vous avez obtenu au moment de la compilation? Dans le premier cas, je pense que c'est normal.


7 Réponses :


12
votes

% p dans printf formate un type de pointeur. Cela va distinguer un pointeur NULL et imprimer (nil) car il s'agit d'une valeur spéciale dans le contexte d'un pointeur. Si vous souhaitez produire 0 pour un pointeur NULL, lancez le pointeur sur un entier et utilisez % d à la place: xxx

réponse originale car il peut toujours être utile:

null est une macro définie comme 0 ou ((vide *) 0) , donc si vous définissez un pointeur Pour NULL C'est exactement la même chose que le réglage sur 0 . Cela fonctionne pour le but de déclarer des pointeurs nuls car la mémoire à l'adresse 0 ne sera jamais allouée à votre programme.


6 commentaires

'nil' n'existe pas en C sauf si vous le définissez.


structure order_line * front = null; ... printf ("tête:% p \ n", avant);


En C, null peut être défini comme ((vide *) 0)


@Chris mais cette ligne aboutit-elle à nil ?


J'ai ajouté une partie du code dans. Le printf est ce qui finit par me donner un (nil)


Je l'ai inscrit que nous avions donné un pointeur qui n'avait pas eu de mémoire alloué à celui-ci au lieu de cela, il était simplement défini.



1
votes

Je suppose que Nil est ce que votre débogueur vous dit. Dans la plupart des compilateurs, NULL est juste #define ED à 0 de toute façon, de sorte que ce nom n'est pas aussi important.


2 commentaires

Je fais un chèque à l'intérieur pour vérifier NULL, mais quand je vérifie ce que cela signifie que je reçois (nil).


Typedef à 0? Ce n'est pas un typlef que j'ai jamais entendu parler. : p



0
votes

Comme d'autres ont déclaré, il n'y a pas de nul le pointeur nul en c.

Peut être votre allocation de mémoire échoue, provoquant l'affectation 0 au pointeur.


0 commentaires

3
votes

Lorsque vous imprimez un pointeur à l'aide de printf ("% p", quelqueptr) , il est imprimé dans une la manière définie par la mise en œuvre , conformément à cette citation du < a href = "http://pubs.opengroup.org/onlinepubs/007908799/xsh/fprintf.html" rel = "nofollow"> Spécification printf de POSIX (libellé similaire existe dans la spécification C99).

L'argument doit être un pointeur à vide. La valeur du pointeur est convertie en une séquence de caractères imprimables, de manière dépendante de la mise en œuvre.

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


2 commentaires

Eh bien, je ne finirai jamais à obtenir (nul) mais y a-t-il un moyen de contourner ce problème parce que mes chèques pour NULL n'atteignent pas cela et continue de faute de SEG MON PROGRAMME


@Chris: Convertissez-le en un type entier et imprimez-le comme un entier plutôt qu'un pointeur (il s'agit également d'un comportement défini par la mise en œuvre, mais est généralement bien supporté). Le type uintptr_t défini dans devrait vous aider.



0
votes

Si votre question consiste à comparer la valeur du pointeur à NULL, la valeur imprimée par Printf () ne devrait pas avoir d'importance. Vous pouvez toujours faire si (ptr == null) pour cela.

    ptr = (nil) et null = (nil) => ptr = null :)
    L'erreur que vous obtenez doit en raison d'une autre raison.

0 commentaires

3
votes

Utilisez xxx

à imprimer tête: (null), 0, (nil)

merci Packia


0 commentaires

0
votes

Après avoir lancé le pointeur de structure avec INT, il fournit la condition attendue avec l'instruction IF .. xxx

sortie: -

L'adresse de la variable est-- -PS-> P --- Après la suppression-- NIL L'adresse de la variable est - PS-> p --- après la suppression-- 0

Il évaluera à FALSE pour si l'état.


0 commentaires