2013-07-08 33 views
2

我學習C的時刻,並複製從wibit.com如下:基本的C程序已停止工作:只是在時間調試器

#include <stdio.h> 

int main() 
{ 
    int* n; 
    *n = 20; 
    printf("%i\n", *n); 
    return 0; 
} 

我使用GCC編譯和運行在命令提示符像這樣:

gcc prgrm.c -o prgrm.exe #compiles without any errors 
prgrm.exe 

然後錯誤彈出說prgrm.exe已停止工作。我點擊調試,並得到這個:

Debug Report

我的所有程序已經運行和我再過測試它(只返回0;或的printf(等))和他們的工作!

任何想法? 感謝

+1

+以及很好的解釋 –

回答

7
int* n; 

聲明一個指針int。它沒有分配地址,因此指向內存中的任意地址。這個地址幾乎肯定不會寫入。即使它是可寫的,它也不是你的記憶,所以你不知道寫它的效果會是什麼。

*n = 20; 

試圖寫入這個不可預知的地址。這導致未定義的行爲。崩潰是一種有效(且有用)的未定義行爲。

爲了使您的程序正常工作,您需要爲n分配存儲空間。您可以在堆上做這個堆棧上

int n; 
n = 20; 
printf("%i\n", n); 

或動態

int* n = malloc(sizeof(*n)); 
if (n == NULL) { 
    printf("Error: out of memory\n"); 
    return -1; 
} 
*n = 20; 
printf("%i\n", *n); 
free(n); 

需要注意的是,如果你打開了警告爲你構建你的編譯器會提醒你這個使用未初始化的變量。將-Wall添加到gcc的命令行或將/W4添加到MSVC以啓用此功能。

+0

感謝您的解釋良好的答案! – Lucidnonsense