基本C程序已停止工作:及时调试

时间:2013-07-08 13:03:12

标签: c debugging error-handling visual-studio-debugging

我正在学习C并且已经从wibit.com复制了以下内容:

#include <stdio.h>

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

我正在使用GCC并在cmd提示符下编译和运行,如下所示:

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

然后弹出错误说prgrm.exe已停止工作。我点击调试并得到这个:

Debug Report

以前我的所有程序都运行过,我用另外几个程序测试它(只返回0;或者printf(等等......))并且它们有效!

有什么想法吗? 感谢

1 个答案:

答案 0 :(得分: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以启用此功能。