2010-11-08 17 views
9

Ich habe einen Zeiger, der auf den Anfang eines Arrays zeigt, aber ich muss überprüfen, dass es nicht zugeordnet ist. Ich dachte daran, den Zeiger zu dereferenzieren und zu prüfen, ob NULL ist, aber das führt zu einem Typfehler. Kann jemand sehen, was ich falsch mache?Zeiger, der auf ein leeres Array zeigt

int mydispose(int *array){ 
    int i = 0; 

    if(*array == NULL){ 
      return 1; 
    } 

    return ; 

}

EDIT: Sorry, wenn ich war nicht klar: Ich habe einen Zeiger, der auf den Anfang eines Arrays zeigt, aber ich wünschte, zu prüfen, ob das Array leer ist.

+11

-1? Die Frage zeigt einen Mangel an Verständnis, aber das ist der springende Punkt, Fragen zu stellen. Der Code ist formatiert und die Frage ist klar. Wenn du jemanden runtermogelst, sag wenigstens warum. – nmichaels

Antwort

11

*array == NULL ist falsch. Sie deneferenzieren zuerst den Zeiger (der zu einem segfault führen könnte, wenn der Zeiger wirklich null ist) und dann seinen int-Wert mit einem Zeigerwert vergleicht. Darüber hinaus wird Ihr Compiler diesen fehlerhaften Ausdruck perfekt akzeptieren, wenn NULL als nur 0 definiert ist und nicht (void *) 0.

Sie sollten array == NULL überprüfen, um zu sehen, ob der übergebene Zeiger auf irgendetwas verweist, und dann deneferenzieren, nur wenn es nicht NULL ist.

Beachten Sie jedoch, dass die Dereferenzierung eines Nicht-Null-Zeigers nicht garantiert ist, um eine sichere Operation zu sein. Wenn der Zeiger einen ungültigen Wert enthält, weil er auf dem Stapel zugeordnet und nicht initialisiert wurde oder wenn er auf eine freigegebene Speicherregion verweist, können schwerwiegende Fehler auftreten.

+0

Danke, das ist, was ich ursprünglich gedacht hatte, aber zeigt mir das nicht nur, dass ich einen Null-Zeiger habe, anstatt einen Zeiger auf ein leeres Array zu zeigen? – Alex

+2

In C gibt es kein leeres Array. Wenn Sie Arrays an Funktionen übergeben, sollten Sie immer eine Zahl übergeben, die die Länge angibt. Wenn diese Zahl Null ist, könnten Sie das Array als leer behandeln. Es gibt jedoch die Vorstellung einer leeren Zeichenkette, da Zeichenketten per Konvention mit einem Nullzeichen am Ende begrenzt werden. Wenn das erste Zeichen ein Nullzeichen ist, wird dies als leere Zeichenfolge betrachtet. –

+0

Okay, danke BB, also sollte ich vielleicht auf Null testen? Ich schreibe malloc() neu, "Diese Funktion wird 1 zurückgeben, wenn das Array die Form einer korrekt initialisierten Struktur ohne aktuell zugewiesene Blöcke hat, andernfalls wird 0 zurückgegeben." – Alex

5

Sie wollen if (array == NULL) - aber wenn Sie zuerst array zu NULL initialisieren, wird es auch nicht gut tun. Ich denke, es wäre besser, wenn Sie sich zurückziehen und uns ein bisschen mehr darüber erzählen, was Sie erreichen wollen, und versuchen, Hilfe zu bekommen, um Ihr Gesamtziel zu erreichen.

+0

Dies. * "... Ich weiß, ich muss Foo machen, aber verstehe nicht wie ..." * ist oft ein Zeichen, dass du * Foo nicht tun musst, aber etwas ganz anderes. – dmckee

+0

@dmckee: Ja, genau. Dies ist besonders wahrscheinlich, wenn/Foo etwas ist, das fast niemand jemals tun muss ... –

0

Sie müssen es wie folgt verwenden:

if(array == NULL) ... 
1

Der einzig sichere Weg, um den Zuweisungsstatus von *array zu bestimmen ist:

  1. Vergewissern Sie sich *array auf NULL gesetzt wird nicht zugeordnet ist. int *array = NULL;
  2. Überprüfen Sie, ob das Array NULL ist: if (array == NULL) return -1;
1

Sie können nicht zuverlässig prüfen, ob einige Speicherplatz zugeordnet ist. *array ist kein gültiger Code, da er array[0] entspricht, aber array[0] nicht zugewiesen ist. Nicht zugewiesener Speicherplatz kann beliebige Wert enthalten.

Die einzige Option besteht darin, sicherzustellen, dass Sie die Information erhalten, ob das Array neben Ihrem Array zugewiesen ist. Eine beliebte Option ist die Darstellung eines nicht zugeordneten Arrays als NULL, Sie können jedoch auch eine andere Option wählen.

Übrigens gibt es einen Unterschied zwischen einem leeren Array (Array der Größe 0) und einem Array, das überhaupt nicht zugeordnet ist. Die erste Option tritt auf, wenn Sie malloc(0) verwenden, die Sekunde, wenn Ihr Zeiger überhaupt nicht initialisiert wird. Für malloc(0) ist es erlaubt, NULL zurückzugeben, aber es ist auch erlaubt, einen Nicht-NULL-Zeiger (den Sie jedoch nicht dereferenzieren können) zurückzugeben. Beide Möglichkeiten gelten gemäß dem Standard.

1

Das unmittelbare Problem mit Ihrem Code ist, dass Sie array dereferenzieren, bevor Sie ihn mit NULL vergleichen. Der Typ Ausdruck*array ist int, nicht int *. Lassen Sie den Dereferenzierungsoperator ab und die Typen passt auf:

if (array == NULL) {...} 

Beachten Sie, dass eine nicht initialisierte Zeiger nur NULL enthalten ist gewährleistet, wenn es mit statischer Ausmaß erklärt wurde (dh es wurde entweder in Dateigültigkeitsbereich deklariert oder mit dem static Schlüsselwort vor). Auf ähnliche Weise wird das Aufrufen von free für einen Zeiger diesen Zeigerwert nicht auf NULL setzen; Es enthält den gleichen Zeigerwert wie zuvor, ist aber jetzt ungültig.

Verwandte Themen