访问合法内存地址时出现分段错误

时间:2015-04-07 16:08:50

标签: c linux segmentation-fault gdb sigsegv

我在尝试使用合法指针获取数据时遇到segmentation fault这种奇怪的情况。我有一个名为INTEGER的{​​{1}}指针,每当我尝试使用pp中获取数据时,我都会遇到分段错误。

我尝试使用*p找出问题。在GDB中,即使我可以使用GDB

获取正确的数据,内存引用仍会引发SIGSEGV

我的代码片段如下:

print *p

确保int *p = (int*)malloc(sizeof(int)); // some other codes printf("%d\n", *p); 不是p。因为我在打印前检查了NULL。但我无法确定它是否指向某个无效位置。因为中间的代码很大才能找到。有什么方法可以检查它是否指向随机位置?

为了确保它没有指向某些随机位置,我在NULL之后和p语句之前打印了malloc中的地址,它们似乎相同。所以我认为地址不是随机的。另外,printf为我提供了我期待的正确数据。

1 个答案:

答案 0 :(得分:0)

  

我在malloc之后和printf语句之前在p中打印了地址,它们看起来是一样的。

绝对确定它们是一样的有多难?

说真的,你需要一种理性的方法,而不是说'#34;帮助,我有大量的代码,我不知道问题可能在哪里" - 没有人可以帮助你提供这些信息。

那么你能做些什么理性的事情呢?

您可以开始在任何地方插入printf("ZZZZ %s: %d: %d\n", __FILE__, __LINE__, *p); 。在printf之后malloc不会立即崩溃,但在某些时候它会发生。恭喜:您刚刚缩小了问题范围。

更快的方法可能是在ValgrindAddressSanitizer下运行您的程序:这些工具通常会引导您直接解决问题。

至于问题究竟是什么,我怀疑你的malloc实际上是在分配几MB的数据,而不是你已经显示的4个字节,对于这样的一大块glibc会调用mmap。如果您稍后free该数据,glibc将munmap该块,并使内存不可访问。下次尝试打印*p(将访问悬空指针)时,会出现分段错误。