Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中指针值更改的可能原因?_C_Pointers_Pthreads - Fatal编程技术网

C中指针值更改的可能原因?

C中指针值更改的可能原因?,c,pointers,pthreads,C,Pointers,Pthreads,我有一个函数 void* fn( void* ptr ){...} 作为pthread中的起始方法。在函数的某个地方,我得到一个错误,ptr(通常指向一个结构)从其原始值更改为0x1000000000000(从printf(“%p”)),尽管在函数fn中没有指定它,但我只读取它的值,如ptr->value。有什么想法吗?这可能是被调用函数中的缓冲区溢出 假设是Linux系统,我通常使用GDB硬件观察点来调试这些bug 您还可以通过valgrind运行程序,这可能是调用函数中的缓冲区溢出 假设是

我有一个函数

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

作为pthread中的起始方法。在函数的某个地方,我得到一个错误,
ptr
(通常指向一个结构)从其原始值更改为0x1000000000000(从
printf(“%p”)
),尽管在函数
fn
中没有指定它,但我只读取它的值,如
ptr->value
。有什么想法吗?

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

假设是Linux系统,我通常使用GDB硬件观察点来调试这些bug


您还可以通过
valgrind

运行程序,这可能是调用函数中的缓冲区溢出

假设是Linux系统,我通常使用GDB硬件观察点来调试这些bug


您也可以通过
valgrind

运行您的程序,而不需要代码,我们无法确定。但是你确定你没有在某个地方意外地使用了
=
而不是
=
?@DarkDust我不仅不会将ptr与任何东西进行比较,也不会将它的任何子值与任何东西进行比较,我只会使用它们分配给其他值或传递给函数。问题是我没有分配给ptr,也没有将&ptr传递给任何东西,所以ptr如何可能改变?具体告诉我们ptr最初指向什么以及如何/在哪里分配。可能是ptr在没有代码的程序执行过程中超出了范围,我们无法判断。但是你确定你没有在某个地方意外地使用了
=
而不是
=
?@DarkDust我不仅不会将ptr与任何东西进行比较,也不会将它的任何子值与任何东西进行比较,我只会使用它们分配给其他值或传递给函数。问题是我没有分配给ptr,也没有将&ptr传递给任何东西,所以ptr如何可能改变?具体告诉我们ptr最初指向什么以及如何/在哪里分配。可能是ptr在程序执行过程中超出了范围谢谢,这是一个很好的建议,我会让你知道它是如何进行的。这是一个很好的调用——硬件观察点没有发现任何东西,但是通过向堆栈中添加更多的局部变量,我可以防止错误的发生。现在我只需要找出它的原因。在你的
fn
(靠近开始处)内放一个断点。到达时,执行
p&ptr在GDB中。让我们假设它回答
0x123456
;do
watch*(void**)0x123456
。我一直在使用watch,但它仍然会在没有通知我的情况下以某种方式发生变化。谢谢,这是一个好建议,我会让您知道它是如何进行的。这是一个很好的调用——硬件观察点没有找到任何东西,但是通过向堆栈添加更多的局部变量,我可以防止错误发生。现在我只需要找出它的原因。在你的
fn
(靠近开始处)内放一个断点。到达时,执行
p&ptr在GDB中。让我们假设它回答
0x123456
;do
watch*(void**)0x123456
。我一直在使用watch,但它还是会在没有通知我的情况下发生变化。