2013-03-28 71 views
0

編輯:好的,我想我現在得到它:關於類型要求澄清投

案例1:

#include <stdio.h> 
#define function(_a) ((_a)*2) 

int main() { 
    int (*func)(int) = function(0); // function(0) = 0 
    func(7); 
... 
} 

語法是否正確,但是,在運行過程中,主要將嘗試訪問地址爲NULL,這會導致unix環境中的windows/segmentation錯誤導致軟件崩潰。

案例2:

#include <stdio.h> 
#define function(_a) ((_a)*2) 

int main() { 
    int (*func)(int) = function; 
    func(7); 
... 
} 

編譯錯誤,因爲「功能」,其實是一個宏,而不是實際的功能,爲此,一個函數指針不能指向它,可以這麼說。

案例3(正確的代碼):

#include <stdio.h> 

    int function(int _a){return ((_a)*2);}; 

    int main() { 
     int (*func)(int) = function; 
     func(7); 
    ... 

} 

我有沒有得到它的權利了?

+1

這是一個的初始化爲'NULL'一個函數指針。 – Mysticial 2013-03-28 03:35:41

+0

http://cdecl.org/ – 2013-03-28 03:44:06

+0

好吧,但是當調用函數時會發生什麼,例如'func(7)'? – Caesar23 2013-03-28 04:21:17

回答

0

int (*func)(int) = 0;裝置func函數指針pointer to a function因此(*func)返回在語句的integer即第一int並呈integer作爲參數即(int)。將int (*func)(int)指定爲0意味着指定函數指針指向NULL

+0

感謝您的回覆,請參閱我對第一個回答的評論:) – Caesar23 2013-03-28 04:03:13

4

這條線不是你認爲的。

int (*func)(int) = 0; 

它是一個變量(稱爲FUNC)的指針具有簽名功能int somename(int),你將它設置爲0。

爲了更好地理解可以這樣考慮:

int myfunction(int a) { return 5;} 

那麼這將工作

int (*func)(int) = myfunction; 
+1

也值得注意的是,在最後一行代碼之後,可以使用'func(10);' – torak 2013-03-28 03:43:59

+0

@torak +1來調用該函數, 。 – 2013-03-28 03:49:27

+0

我明白了! ,我完全錯了!實際上,原始代碼是: int(* func)(int)= function(0);' 和函數被定義爲: '#define function(_a)((_a)* 2)' – Caesar23 2013-03-28 03:58:58