2012-04-04 106 views
2

假設我們有一個函數指針:C中的空函數指針是什麼意思?

void (*func0)(void); 

也被定義爲:

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

但是說,在某些時候,我們試圖以某種方式訪問​​函數指針,那麼如果MS VS調試器顯示當我進入代碼時,func0實際上指向0x0000,這是什麼意思?另外,請讓我知道什麼是最好的解決方案?謝謝。

+1

第一行定義了一個函數指針,沒有初始化,第二行定義一個恰好具有相同名稱的函數。 – wildplasser 2012-04-04 15:31:22

回答

8

這是未定義的行爲來取消引用空指針。修復只是爲了確保指針指向一個適當的函數。

在你的情況,你想是這樣的:

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

,再後來,你可以分配到func0

func0 = &MyFunction; 

請注意,我使用的是不同的名稱,函數指針變量,實際功能。

現在你可以調用的函數,通過函數指針:

func0(); 
5

我想你混淆命名定義函數指針。我只想指出,如果你寫

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

你確實有相同的名稱func0兩個完全不相關的對象。第一個func0是一個函數,第二個func0是一個變量與類型指針功能。

假設你申報你的變量func0全局(任何函數之外),它會自動初始化爲零,所以編譯器將讀取你的線

void (*func0)(void); 

void (*func0)(void) = NULL; 

所以變量func0將使用值NULL初始化,並且在大多數系統上NULL實際上將是0

你的調試器現在告訴你,你的變量func0具有價值0x0000,這是0。所以這真的不是什麼大驚喜。

爲了您的關於「修復」的問題 - 好了,我想你想一個函數指針,指向你的函數func0,這樣你就可以做到以下幾點:

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

甚至更​​好(雖然在大多數編譯器不是必要的),你可以寫

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

所以你初始化變量pFunc(我強烈建議重新命名它!)指向func0。更精確一點:您可以使用func0功能的地址&...,並將該值分配給您的變量pFunc

現在可以「呼叫」函數指針(這意味着調用的函數,其函數指針指向)由:

pFunc(); //will call function func0