gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:39:45 25 4
gpt4 key购买 nike

在尝试从合法指针中获取数据时,我遇到了这种奇怪的段错误场景。我有一个名为 pINTEGER 指针,每当我尝试使用 *p 获取 p 中的数据时,我遇到段错误。

我尝试使用GDB找出问题。在 GDB 中,即使我可以使用 print *p 获取正确的数据,内存引用仍然会抛出 SIGSEGV

我的代码片段如下:

int *p = (int*)malloc(sizeof(int));
// some other codes
printf("%d\n", *p);

当然p不是NULL。因为我在打印之前检查了 NULL 。但我无法确定它是否指向某个无效位置。因为中间的代码太大了,不好找出来。有什么方法可以检查它是否指向随机位置?

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

最佳答案

I printed the address in p just after the malloc and before the printf statement and they seem to be same.

绝对确定它们是相同的有多难?

说真的,你需要一种理性的方法,而不是说“帮助,我有大量代码,而且我不知道问题可能出在哪里”——也没有人可以帮助你提供这些信息。

那么你可以做哪些理性的事情呢?

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

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

至于问题实际上是什么,我怀疑您的malloc实际上分配了几兆字节的数据,而不是您显示的4个字节,并且对于这么大的 block glibc会调用mmap。如果您稍后释放该数据,glibc将munmap该 block ,并使内存不可访问。下次尝试打印*p(这将访问悬空指针)时,您会遇到段错误。

关于c - 访问合法内存地址时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29496129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com