我正在学习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(等等......))并且它们有效!
有什么想法吗? 感谢
答案 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以启用此功能。