Frage

Ich arbeite an einem Projekt, und ich immer über diesen Fehler kommen, die nicht zulassen, dass ich das Projekt abzuschließen. Wenn ich einen meiner Zeiger auf Punkt zu einem Objekt zu initialisieren, die während der Ausführung des Programms gemacht wird und ich initialisieren es NULL. Dann, wenn ich zu überprüfen, um zu sehen, was es festgelegt ist, um es mit einem Wert von nil zurückgibt. Wie ist so etwas möglich? Ich glaubte nicht, dass Null-Zeiger in C existiert Gibt es eine Möglichkeit, um dieses?

struct order_line *front = NULL;
...
printf("Head: %p\n", front);  // prints -> Head: (nil)
War es hilfreich?

Lösung

%p in printf formatiert eine Zeigertyp. Das wird ein Null-Zeiger unterscheiden und drucken (nil) weil es ein besonderer Wert im Rahmen eines Zeigers ist. Wenn Sie die Ausgabe 0 für einen Null-Zeiger wollen, werfen Sie den Mauszeiger auf eine ganze Zahl und Verwendung %d statt:

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

Original Antwort, da es immer noch nützlich sein kann:

NULL ist ein Makro als 0 oder ((void *) 0) definiert, so dass, wenn Sie einen Zeiger gesetzt, genau NULL es ist das gleiche, wie es 0 Einstellung. Dies funktioniert für die beabsichtigten Null-Zeiger zu deklarieren, da der Speicher bei der Adresse 0 wird nie zu Ihrem Programm zugewiesen werden.

Andere Tipps

Wenn Sie einen Zeiger mit printf("%p", somePtr) drucken, wird es gedruckt in einer Implementierung definiert , gemäß diesem Zitat aus dem POSIX printf Spezifikation (ähnliche Formulierung besteht in der C99-Spezifikation auch).

Das Argument muss ein Zeiger auf ungültig. Der Wert des Zeigers auf eine Folge von druckbaren Zeichen umgewandelt wird, in einer implementierungsabhängigen Weise.

Ich denke, dass dies bedeutet, wenn der Zeiger NULL ist, kann es es jedoch ausdrucken will, einschließlich Druck als nil oder 0x00000000 oder 0.

Verwendung

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

Head: (null), 0, (nil)

drucken

Danke Packia

Ich gehe davon aus, dass null ist, was Ihr Debugger sagt Ihnen. In den meisten Compiler ist null nur #define ed auf 0 ohnehin so, dass Name ist nicht so wichtig.

Wie schon andere gesagt haben, gibt es nicht so etwas wie Null-Zeiger in C.

Ihre Speicherzuweisung nicht sein kann, 0 verursacht den Zeiger zugewiesen werden.

Wenn Ihre Frage bezieht sich auf den Zeigerwert auf NULL zu vergleichen den Wert dann durch printf gedruckt () sollte dabei keine Rolle. Sie können immer noch tun if (ptr == NULL) für die.

    ptr = (nil) und NULL = (nil) => ptr = NULL:)

Der Fehler, den Sie bekommen muss wegen eines anderen Grundes.

Nach dem Strukturzeiger mit int Gießen, bietet es die erwartete Bedingung mit if-Anweisung ..

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);
}

OUTPUT: -

Die Adresse der Variablen --- PS-> p --- Nach Deletion-- nil Die Adresse der Variablen --- PS-> p --- Nach Deletion-- 0

es wird das Ergebnis falsch für, wenn die Bedingung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top