2012-02-27 105 views
1

我偶然發現的東西讓我感到驚奇。 這爲什麼有效?將一個指針作爲參數傳遞給C中的一個函數

void foo (int* a) 
{ 
    int x = 3; 
    *a = x; 
} 

int main() 
{ 
    int a; 
    foo(&a); 
    return 0; 
} 

但是,這會導致分段錯誤(在Visual Studio 2008和gcc上)?

void foo (int* a) 
{ 
    int x = 3; 
    *a = x; 
} 

int main() 
{ 
    int* a; 
    foo(a); 
    return 0; 
} 

是在語言中定義的東西還是隻是一個實現問題?

+0

您應該在第二個示例中收到警告。 – Mysticial 2012-02-27 00:52:39

回答

4

當你聲明

int* a; 

您聲明變量a一個指針,但你沒有把它指向任何東西。然後在功能,你做

*a = x; 

其中取消引用指針,並試圖賦予它指向的x值。但是由於它沒有指向任何東西,你會得到未定義的行爲,表現爲分段錯誤。

你應該這樣做:

int i; // the actual integer variable 
int* a = &i; // a points to i 

說,第一個之間的區別是,int a;聲明瞭一個真正的整型變量,然後你把它的地址與&a並把它傳遞給函數。函數foo內的指針a指向main中的變量a,因此解引用它並將其分配給它非常好。

+1

也有問題:'printf(「%d \ n」,a);',因爲''%d「'期望int類型,但'a'類型爲'int *'。 – 2012-02-27 00:56:32

+0

@ChrisLutz明白了,謝謝。 – 2012-02-27 00:58:51

+0

謝謝。即使沒有printf,分段錯誤也會發生,所以我把它從問題 – 2012-02-27 01:02:53

2
int a; 

只要你聲明它就分配內存,但這不是int * a;

int *a; 

是指針聲明(MEMORY尚未分配給它)。

int *a = (int*)malloc(sizeof(int)); // allocate memory 
相關問題