Was bedeutet der Nullfunktionszeiger in C?

Angenommen, wir haben einen Funktionszeiger:

<code>void (*func0)(void);
</code>

was auch definiert ist:

<code>void func0(void) { printf( "0\n" ); }
</code>

Aber sagen wir, irgendwann versuchen wir irgendwie auf den Funktionszeiger zuzugreifen. Wenn der MS VS-Debugger dann anzeigt, dass func0 tatsächlich auf 0x0000 zeigt, wenn ich in den Code gehe, was bedeutet das? Und bitte lassen Sie mich auch wissen, was die beste Lösung ist. Vielen Dank.

 wildplasser04. Apr. 2012, 17:31
Die erste Zeile definiert einen Funktionszeiger ohne Initialisierung. Die zweite Zeile definiert eine Funktion mit demselben Namen.

Antworten auf die Frage(2)

einen Nullzeiger zu de-referenzieren. Das Update dient lediglich dazu, sicherzustellen, dass der Zeiger auf eine geeignete Funktion verweist.

In deinem Fall möchtest du so etwas:

<code>void MyFunction(void)
{
    printf( "0\n" ); 
}
</code>

und dann später können Sie zuweisenfunc0:

<code>func0 = &MyFunction;
</code>

Beachten Sie, dass ich für die Funktionszeigervariable und die eigentliche Funktion einen anderen Namen verwende.

Und jetzt können Sie die Funktion über den Funktionszeiger aufrufen:

<code>func0();
</code>

Ich denke, Sie verwechselnBenennung unddefinieren Funktionszeiger. Ich werde nur darauf hinweisen, wenn Sie schreiben

<code>void func0(void) { printf( "0\n" ); }
void (*func0)(void);
</code>

Sie haben tatsächlich zwei völlig unabhängige Objekte mit demselben Namenfunc0. Der Erstefunc0 ist einFunktion, der Zweitefunc0 ist einVariable mit Typ Zeiger auf Funktion.

Vorausgesetzt, Sie haben Ihre angegebenVariable func0 global (außerhalb jeder Funktion) wird es automatisch auf Null gesetzt, sodass der Compiler Ihre Zeile liest

<code>void (*func0)(void);
</code>

wie

<code>void (*func0)(void) = NULL;
</code>

Also die Variablefunc0 wird mit dem Wert initialisiertNULLund auf den meisten SystemenNULL wird es tatsächlich sein0.

Ihr Debugger teilt Ihnen jetzt mit, dassVariable func0 hat den Wert0x0000, welches ist0. Das ist also keine große Überraschung.

Auf Ihre Frage zu einem "Fix" - na ja, ich nehme an, Sie möchten einen Funktionszeiger, der auf Ihre Funktion verweistfunc0So können Sie Folgendes tun:

<code>void func0(void) { printf( "0\n" ); }
void (*pFunc)(void) = func0;
</code>

oder noch besser (obwohl auf den meisten Compilern nicht erforderlich) können Sie schreiben

<code>void (*pFunc)(void) = &func0;
</code>

Sie initialisieren also Ihre VariablepFunc (Ich empfehle dringend, es umzubenennen!), Um auf zu verweisenfunc0. Ein bisschen genauer: Sie nehmen die Adresse&... der Funktionfunc0 und weisen Sie diesen Wert Ihrer Variablen zupFunc.

Jetzt können Sie den Funktionszeiger "aufrufen" (dh die Funktion aufrufen, auf die der Funktionszeiger zeigt) durch:

<code>pFunc(); //will call function func0
</code>

Ihre Antwort auf die Frage