为什么会产生分段错误(核心转储)错误?

时间:2019-06-05 08:05:09

标签: c

我是指针的新手,并且正在运行一些测试代码。我知道分段错误意味着我正在尝试访问一些我不应该访问的内存;但是,我不明白我在这里的思路出了什么问题。

int main(void) {
   int *ptr;
   *ptr = 400;
   printf("%d\n", *ptr);
   return 0;
}

该函数编译正常。据我了解,声明ptr时,它具有任意的内存地址。然后,第二行将400作为对该内存地址的引用。最后,printf()行应返回400,但这给了我一个核心转储。

有人可以澄清吗?我看了几个指针示例,我以为我已经掌握了它,直到尝试了这个。

1 个答案:

答案 0 :(得分:1)

您没有要写入的内存。您需要分配内存以便能够对其进行写入。否则,您(可能)会遇到细分错误。

如果您将打开编译时警告,则clang会警告您

prog.cc:6:5: warning: variable 'ptr' is uninitialized when used here [-Wuninitialized]
   *ptr = 400;
    ^~~
prog.cc:4:12: note: initialize the variable 'ptr' to silence this warning
   int *ptr ;

这是更正的代码

#include <stdio.h>
#include<stdlib.h>
int main(void) {
   int *ptr = (int*)malloc(sizeof(int));
   *ptr = 400;
   printf("%d\n", *ptr);
   return 0;
}