我在尝试使用合法指针获取数据时遇到segmentation fault
这种奇怪的情况。我有一个名为INTEGER
的{{1}}指针,每当我尝试使用p
在p
中获取数据时,我都会遇到分段错误。
我尝试使用*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
为我提供了我期待的正确数据。
答案 0 :(得分:0)
我在malloc之后和printf语句之前在p中打印了地址,它们看起来是一样的。
绝对确定它们是一样的有多难?
说真的,你需要一种理性的方法,而不是说'#34;帮助,我有大量的代码,我不知道问题可能在哪里" - 没有人可以帮助你提供这些信息。
那么你能做些什么理性的事情呢?
您可以开始在任何地方插入printf("ZZZZ %s: %d: %d\n", __FILE__, __LINE__, *p);
。在printf
之后malloc
不会立即崩溃,但在某些时候它会发生。恭喜:您刚刚缩小了问题范围。
更快的方法可能是在Valgrind或AddressSanitizer下运行您的程序:这些工具通常会引导您直接解决问题。
至于问题究竟是什么,我怀疑你的malloc
实际上是在分配几MB的数据,而不是你已经显示的4个字节,对于这样的一大块glibc会调用mmap
。如果您稍后free
该数据,glibc将munmap
该块,并使内存不可访问。下次尝试打印*p
(将访问悬空指针)时,会出现分段错误。