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

Luc*_*nse 2 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;
}
Run Code Online (Sandbox Code Playgroud)

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

gcc prgrm.c -o prgrm.exe    #compiles without any errors
prgrm.exe
Run Code Online (Sandbox Code Playgroud)

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

调试报告

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

有任何想法吗?谢谢

sim*_*onc 7

int* n;
Run Code Online (Sandbox Code Playgroud)

声明指向int.它没有分配地址,因此指向内存中的任意地址.这个地址几乎肯定不会写.即使它是可写的,也不是你的记忆所以你不知道写它的效果是什么.

*n = 20;
Run Code Online (Sandbox Code Playgroud)

试图写入这个不可预测的地址.这导致未定义的行为.崩溃是一种有效(且有用)类型的未定义行为.

要使程序正常工作,您需要为其分配存储空间 n.你可以在堆栈上执行此操作

int n;
n = 20;
printf("%i\n", n);
Run Code Online (Sandbox Code Playgroud)

或动态地在堆上

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

请注意,如果为构建启用了警告,则编译器会警告您使用未初始化的变量.添加-Wall到gcc或/W4MSVC的命令行以启用此功能.