【问题标题】:Possible causes for pointer value change in C?C中指针值更改的可能原因?
【发布时间】:2011-11-24 09:01:20
【问题描述】:

我有一个函数

void* fn( void* ptr ){...}

我在 pthread 中用作启动方法。在函数的某个地方,我收到一个错误,其中 ptr(通常指向一个结构)从其原始值更改为 0x100000000000000(从 printf("%p") ),尽管函数 fn 没有被分配给它,我是只读取它的值,如ptr->value。有什么想法吗?

【问题讨论】:

  • 没有代码,我们无法分辨。但是确定你没有不小心在某个地方使用了= 而不是==
  • @DarkDust 我不仅不将 ptr 与任何东西进行比较,我也不将它的任何子值与任何东西进行比较,我只使用它们来分配其他值或传递给函数。问题是我没有分配给 ptr,也没有将 &ptr 传递给任何东西,那么 ptr 怎么可能改变呢?
  • 具体向我们展示了 ptr 最初指向的内容以及分配方式/位置。可能是 ptr 在程序执行过程中超出范围

标签: c pointers pthreads


【解决方案1】:

这可能是被调用函数中的缓冲区溢出。

假设是 Linux 系统,我通常使用 GDBhardware watchpoints 来调试此类错误。

您也可以通过valgrind 运行您的程序。

【讨论】:

  • 谢谢,这是个好建议,我会告诉你进展如何。
  • 这是一个很好的调用——硬件观察点没有找到任何东西,但是通过向堆栈添加更多的局部变量,我可以防止错误发生。现在我只需要找出是什么原因造成的。
  • 在您的fn 中放置一个断点(接近开头)。当您到达时,请在 GDB 中执行p &ptr;。让我们假设它回答了0x123456;做watch *(void**)0x123456.
  • 我一直在使用手表,但它仍然在没有通知我的情况下发生了某种变化。
猜你喜欢
  • 2011-02-03
  • 2016-09-16
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
相关资源
最近更新 更多