假設我們有一個函數指針:C中的空函數指針是什麼意思?
void (*func0)(void);
也被定義爲:
void func0(void) { printf("0\n"); }
但是說,在某些時候,我們試圖以某種方式訪問函數指針,那麼如果MS VS調試器顯示當我進入代碼時,func0實際上指向0x0000,這是什麼意思?另外,請讓我知道什麼是最好的解決方案?謝謝。
假設我們有一個函數指針:C中的空函數指針是什麼意思?
void (*func0)(void);
也被定義爲:
void func0(void) { printf("0\n"); }
但是說,在某些時候,我們試圖以某種方式訪問函數指針,那麼如果MS VS調試器顯示當我進入代碼時,func0實際上指向0x0000,這是什麼意思?另外,請讓我知道什麼是最好的解決方案?謝謝。
這是未定義的行爲來取消引用空指針。修復只是爲了確保指針指向一個適當的函數。
在你的情況,你想是這樣的:
void MyFunction(void)
{
printf("0\n");
}
,再後來,你可以分配到func0
:
func0 = &MyFunction;
請注意,我使用的是不同的名稱,函數指針變量,實際功能。
現在你可以調用的函數,通過函數指針:
func0();
我想你混淆命名和定義函數指針。我只想指出,如果你寫
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
第一行定義了一個函數指針,沒有初始化,第二行定義一個恰好具有相同名稱的函數。 – wildplasser 2012-04-04 15:31:22