2012-04-04 10 views
2

Sagen wir einen Funktionszeiger haben:Was bedeutet Nullfunktionszeiger in C?

void (*func0)(void); 

die auch definiert:

void func0(void) { printf("0\n"); } 

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

+1

Die erste Linie definiert einen Funktionszeiger, ohne Initialisierung, wobei die zweite Leitung definiert eine Funktion, die zufällig denselben Namen hat. – wildplasser

Antwort

8

Es ist undefiniertes Verhalten, einen Null-Zeiger zu de-referenzieren. Die Lösung besteht einfach darin, sicherzustellen, dass der Zeiger auf eine geeignete Funktion verweist.

In Ihrem Fall, dass Sie so etwas wie dies wollen:

void MyFunction(void) 
{ 
    printf("0\n"); 
} 

und dann später können Sie zuweisen func0:

func0 = &MyFunction; 

Bitte beachte, dass ich einen anderen Namen für die Funktion Zeigervariable verwenden und die eigentliche Funktion.

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

func0(); 
5

Ich glaube, Sie sind Vertauschen und Benennung Funktionszeiger definieren. Ich werde Sie brauchen nur darauf hin, dass, wenn Sie

schreiben
void func0(void) { printf("0\n"); } 
void (*func0)(void); 

Sie haben tatsächlich zwei völlig unabhängige Objekte mit dem gleichen Namen func0. Die erste func0 ist eine Funktion, die zweite func0 ist eine Variable mit Typ Zeiger-zur-Funktion.

Angenommen, Sie erklärt Ihre Variablefunc0 global (außerhalb jeder Funktion), wird es automatisch Null initialisiert werden, so wird der Compiler Ihre Linie

void (*func0)(void); 

als

void (*func0)(void) = NULL; 

So lesen Die Variable func0 wird mit dem Wert NULL initialisiert, und auf den meisten Systemen wird NULL tatsächlich 0 sein.

Ihr Debugger jetzt sagt Ihnen, dass Ihr Variablefunc0 den Wert 0x0000 hat, die 0 ist. Das ist wirklich keine große Überraschung.

Um Ihre Frage zu einem „fix“ - na ja, ich nehme an, Sie einen Funktionszeiger wollen, der auf Ihre Funktion func0, so können Sie Folgendes tun können:

void func0(void) { printf("0\n"); } 
void (*pFunc)(void) = func0; 

oder noch besser (wenn auch auf den meisten Compiler nicht erforderlich) können Sie schreiben

void (*pFunc)(void) = &func0; 

so initialisieren Sie Ihre Variable pFunc (ich empfehle die Umbenennung es sehr!) zu func0 zeigen. Ein bisschen genauer: Sie nehmen die Adresse &... der Funktion func0 und weisen diesen Wert Ihrer Variablen pFunc zu.

Jetzt können Sie „Anruf“ den Funktionszeiger (das heißt, um die Funktion aufzurufen, die die Funktion Zeiger auf) von:

pFunc(); //will call function func0