2013-04-02 80 views
-3
#include <stdio.h> 

int main(void) 
{ 
    int* a; 
    *a=20; 
    printf("%i\n",*a); 

    return 0; 
} 

我有上面的代碼。當運行時代碼時,我總是會收到錯誤消息「filename.exe已停止工作」。爲什麼?一個簡單的指針代碼

+5

未初始化的指針。 – cnicutar

回答

6

您沒有爲要指向的指針分配任何內存。你可以這樣做是這樣的:

int *a = malloc(sizeof(*a)); 

或像這樣:

int value; 
int *a = &value; 

如果用malloc分配,那麼你會想,當你使用完畢後調用free上的指針。

訪問未初始化的指針會導致未定義的行爲。在你的程序中,它導致了分段錯誤,這是未初始化指針訪問的一個非常普遍的結果。

+0

還將釋放的指針設置爲NULL。 :) –

+0

@ Vivek27呃,爲什麼?不一定要這樣做。 –

+0

我的理解是免費的,'a'現在懸掛的指針可能有一個地址,但沒有指向任何有效的內存位置。所以這是一個很好的做法,將其設置爲NULL –

1

int* a;a的默認值是垃圾,並且指向無效內存,您不能指定給那個。像*a=20;這樣的賦值在運行時會導致未定義的行爲。 (語法明智的代碼是正確的,所以編譯)你可能會有一段時間也得到seg-fault。

任一操作:

int i; 
int *a = &i; // a points to a valid memory that is i 
*a = 20; 

或使用釋放calloc動態存儲器分配()或的malloc()函數。

int *a = malloc(sizeof(int)); 
*a = 20; 

記住動態分配的內存,我們必須取消分配(免費),明確當我們與完成。

0

你有wild pointer,或者使用malloc

int* a = malloc(sizeof(int)); 

分配內存,或使用堆棧變量

int b = 0; 
int *a = &b; 
*a=20; 
+0

好的,謝謝! –

0

的問題是在你的任務 * A = 20

你不能像這樣給一個指針變量賦值。

int b = 20; a =&b;

感謝, Santhosh