gpt4 book ai didi

C 指针在执行期间奇怪地自增量为未知值

转载 作者:行者123 更新时间:2023-11-30 15:58:42 26 4
gpt4 key购买 nike

由于程序中的“指针损坏”,我遇到了错误。这是导致崩溃的错误代码。

list_ptr = list_head;

while(list_ptr) {

printf("The value of list ptr is now %p\n", list_ptr);
//do something;

list_ptr = list_ptr->next;

printf("After increment, the value of list ptr is now %p\n", list_ptr);

}

现在,当我执行该程序时,我在列表末尾得到以下输出:

..
..
..

The value of list ptr is 0x74c770
After increment, the value of list ptr is 0x6da280
The value of list ptr is 0x6da281
After increment, the value of list ptr is 0xce00000000006e80

在一次迭代结束时,列表 ptr 的值是 0x6da280,但在下一次迭代开始时,它会更改为 0x6da281。在此之后,尝试访问 ptr->next 似乎返回值 0xce00000000006e80,这不是值指针。

这是一个多线程程序,列表指针由另外两个线程访问。但我在每次访问时都使用互斥锁。

我尝试再次在类似的设置中运行该程序,但无法得到相同的错误。然而它仍然在同一个循环内崩溃。我的猜测是指针仍然被损坏,但这次是在我打印值之后。

有什么建议吗?

我使用的是红帽企业 Linux 6.1。

提前致谢。

编辑:最初我也怀疑存在竞争条件,但现在我确信情况并非如此。尽管所讨论的变量是在其他两个线程内访问的,但它们都使用正确的互斥锁。

这是一个多线程程序, fork 了大约 500 个子进程。问题出现在第 470 个 fork 之后的某个地方(并不一致)。请参阅下面的列表是由父级维护的全局数据结构,用于跟踪其子级。每次 fork 新的子项时,相应的条目都会添加到此列表中。在第 470 个 fork 之后的某个地方,当遍​​历列表时,似乎出现了损坏。

我的同事怀疑这可能是由于堆栈损坏造成的。但我们还无法验证这一点。

最佳答案

您提到的第一个问题是指针值的自动递增。正如awoodland所说,我相信,这是因为saome种族条件。

但是第二个问题,list_ptr -> next,我认为你已经声明了指针但从未初始化过值。所以一些未定义的垃圾值就来了。 (这只是一个建议。如果您给出更多解释代码,我们可以找到确切的问题)

关于C 指针在执行期间奇怪地自增量为未知值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9564262/

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