Das Dereferenzieren eines Zeigers in einem 'for'-Schleifeninitialisierer erzeugt einen Segmentierungsfehler




for-loop pointers (2)

Ich habe ein Problem bei der Verwendung von Zeigern in einer for Schleife. In meinem for Schleifeninitialisierer dereferenziere ich einen int Zeiger und gebe ihm den Wert '0'. Wenn ich diesen dereferenzierten Zeiger in der Schleife verwende, erhalte ich einen Segmentierungsfehler und verstehe nicht, warum. Ich benutze Code::Blocks und den C GNU GCC Compiler.

  1. Wenn ich mir das Überwachungsfenster ansehe, sehe ich, dass die Variable während der for Schleife eine Zufallszahl hat.

  2. Es scheint, dass der dereferenzierte Zeiger während der for Schleife den Gültigkeitsbereich verliert.

Der Code:

#include <stdio.h>

int main(void)
{
    int val = 0;
    int *p = NULL;
    int answer = 0;

    p = &val;

    *p = 1; // This dereferences and sets to one successfully

    for (int i=3, (*p)=0 ; i>=0; i--) // Here *p is a random number
    {
        printf("do stuff");
        (*p) += 1; // Here it causes a segmentation fault
    }
    answer = *p;
}

Ich dachte, dass es keine Probleme geben würde, einen Zeiger so zu benutzen, wie ich bin.


Hier genau hinschauen:

for (int i=3, (*p)=0 ; i>=0; i--)

Im ersten Teil von for definieren Sie eine neue Zeigervariable mit dem Namen p die das zuvor definierte p abschattet und mit NULL initialisiert. Anschließend dereferenzieren Sie den NULL-Zeiger in der Schleife, die den Segfault verursacht.

Sie können nicht gleichzeitig eine Variablendefinition und eine Zuweisung zu einer vorhandenen Variablen haben, also verschieben Sie die Zuweisung von *p vor die Schleife:

*p = 0;
for (int i=3; i>=0; i--)

Oder Sie können i außerhalb der Schleife definieren:

int i;
for (i=3, (*p)=0 ; i>=0; i--)

Sie könnten diese zusammenpressen, indem Sie den Komma-Operator missbrauchen:

for (int i=(*p=0,3) ; i>=0; i--)

Hier erfolgt die Zuweisung zu p als Teil des Initialisierers für i sodass keine neue Variable deklariert wird. Dies würde ich jedoch nicht empfehlen, da dies das Lesen und Verstehen Ihres Codes erschwert.


Sie deklarieren eine völlig neue Variable mit dem Namen p :

for (int i=3, (*p)=0 ; i>=0; i--)

Dies ist dasselbe wie:

for (int i=3, *p=0 ; i>=0; i--)

Sie erstellen also ein int i und ein int *p , die auf die Adresse 0 zeigen. Dies ist nicht das gleiche p wie das zuvor definierte. Es beschattet es nur. Wenn Sie es dereferenzieren, erhalten Sie den Segfault.





declaration