C Zeiger auf NULL zuweisen

Lesezeit: 3 Minuten

Ich missverstehe etwas Grundlegendes über Zeiger in C, das sollte einfach sein, aber die Suche bringt nichts. Ich verstehe das Verhalten des folgenden Codes nicht;

#include <stdlib.h>
#include <stdio.h>

void my_function(char *);

int main(int argc, char *argv[]) {
    char *ptr;
    ptr = malloc(10);

    if(ptr != NULL) printf("FIRST TEST: ptr is not null\n");
    else printf("FIRST TEST: ptr is null\n");

    my_function(ptr);

    if(ptr != NULL) printf("SECOND TEST: ptr is not null\n");
    else printf("SECOND TEST: ptr is null\n");
}

void my_function(char *a) {
    a = NULL;
}

Welche Ausgänge;

FIRST TEST: ptr is not null
SECOND TEST: ptr is not null

Warum sieht der zweite Test den Zeiger immer noch als nicht NULL an? Ich versuche, eine NULL-Zeigerzuweisung als eine Art “Rückgabeflag” zu verwenden, um einen bestimmten Fehler der Funktion anzuzeigen. Aber beim anschließenden Testen des Zeigers scheint es nicht NULL zu sein.

Das liegt daran, dass der Zeiger als Wert und nicht als Referenz übergeben wird. Wenn Sie den Zeiger innerhalb der Funktion ändern möchten, müssen Sie den eigentlichen Zeiger als Zeiger übergeben, dh einen Zeiger auf einen Zeiger:

void my_function(char **a)
{
    *a = NULL;
}

Verwenden Sie den address-of-Operator & Wenn Sie die Funktion aufrufen, um die Adresse des Zeigers zu erhalten:

my_function(&ptr);

  • Mir ist plötzlich aufgefallen, wie blöd das war, kurz bevor Sie geantwortet haben, ich brauche einen Zeiger auf einen Zeiger, um den äußeren Zeiger zuweisen zu können!

    – Lynchen

    30. April 2013 um 12:03 Uhr

Benutzeravatar von Rüppell's Vulture
Rüppells Geier

Deine Meinung a=NULL in my_function() setzt tatsächlich den Wert von a zu NULLaber a ist eine lokale Variable dieser Funktion. Wenn Sie bestanden haben ptr zu my_function() in main()der Wert von ptr kopiert wurde a.Ich nehme an, Ihre ganze Verwirrung ist darauf zurückzuführen * früher verwendet a in der Definition von my_function().

Zeiger werden im Allgemeinen an Funktionen übergeben, wenn wir die ursprünglichen Werte, auf die diese Zeiger zeigen, von der aufgerufenen Funktion manipulieren möchten, und dies geschieht durch dereferencing diese Zeiger von den aufgerufenen Funktionen. In diesem Fall hätten Sie Folgendes verwendet:

*a= blah blah;

es hätte sich im Wert an der Adresse widergespiegelt, auf die von gezeigt wird ptr in main().Aber da willst du den Wert von ändern ptr selbst, müssen Sie in der Lage sein, einen Weg zu haben manipulate es aus my_function().Dafür verwenden Sie a pointer-to-pointerdh vom Typ char**.Sie bestehen eine solche char** als Argument zu my_function(() und verwenden Sie es, um den Wert von zu ändern ptr.Hier ist die Variation Ihres Codes, die dies für Sie tun würde:

#include <stdlib.h>
#include <stdio.h>

void my_function(char **); // Change char* to char**

int main(int argc, char *argv[]) {
    char *ptr;
    ptr = malloc(10);

    if(ptr != NULL) printf("FIRST TEST: ptr is not null\n");
    else printf("FIRST TEST: ptr is null\n");

    my_function(&ptr); //You pass a char**

    if(ptr != NULL) printf("SECOND TEST: ptr is not null\n");
    else printf("SECOND TEST: ptr is null\n");
}

void my_function(char **a) {  //Change char* to char** here
    *a = NULL;
}

in C, ein Funktionsaufruf wie foo(a) wird niemals den Wert von a ändern.

Ihre Funktion sollte a dauern char** a wenn Sie ändern möchten, worauf es zeigt. Dies liegt daran, dass Zeiger sind kopiert als Argumente für eine Funktion, was bedeutet, dass alle Änderungen, die Sie darin vornehmen, außerhalb der Funktion nicht sichtbar sind, da sie eine Kopie ändern.

Wenn Sie es ändern und außerhalb des Funktionsumfangs sehen möchten, müssen Sie eine weitere Umleitung hinzufügen.

Beim Übergeben des Zeigers an die Funktion wird der Zeiger in den Funktionsbereich kopiert. Sie müssen einen Zeiger auf Zeiger verwenden, wenn Sie solche Dinge tun möchten. Ein Pointer ist im Grunde nur ein Integer/Long

Benutzeravatar von Chris Tang
Chris Tang

Dein Problem ist, dass my_pointer gets schreibt nicht in den Zeiger ptraber seine Kopie, *a.

Sie müssen die Adresse von übergeben ptr mach was du willst.

1432930cookie-checkC Zeiger auf NULL zuweisen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy