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(等等......))并且它们有效!
有任何想法吗?谢谢
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或/W4
MSVC的命令行以启用此功能.