2

我现在正在学习 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已停止工作。我点击调试并得到这个:

调试报告

我所有的程序之前都运行过,我用另外几个(只返回 0; 或 printf(etc...) )对其进行了测试,它们可以工作!

有任何想法吗?谢谢

4

1 回答 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 或/W4MSVC 的命令行以启用此功能。

于 2013-07-08T13:07:20.683 回答