2011-11-24 30 views
0

我有一個功能C中指針值更改的可能原因?

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

,我使用如在並行線程的啓動方法。在函數的某處,我得到一個錯誤,其中ptr(通常指向一個結構體)從其原始值更改爲0x100000000000000(從printf("%p")),儘管在函數fn中沒有任何地方被分配給它,我只讀取它的值,如ptr->value 。有任何想法嗎?

+3

沒有代碼,我們不能說。但是肯定你沒有在某處不小心使用'='而不是'=='? – DarkDust

+0

@DarkDust不僅我不比較ptr和任何東西,我也不比較任何它的子值,我只用它們來分配其他值或傳遞給函數。問題是我沒有分配給ptr,而且我也沒有將任何東西傳遞給ptr,那麼ptr怎麼可能改變呢? –

+0

具體向我們展示了什麼_ptr_指向原來以及如何/在哪裏分配。這可能是_ptr_在程序執行過程中超出範圍 –

回答

3

它可能是被調用函數的緩衝區溢出。

假設一個Linux系統,我通常會用GDB 硬件觀察點調試這樣的錯誤。

你也可以運行你的程序,通過valgrind

+0

謝謝,這是一個很好的建議,我會告訴你它是如何發生的。 –

+0

這是一個很好的調用 - 硬件觀察點沒有找到任何東西,但通過向堆棧添加更多局部變量,我可以防止發生錯誤。現在我只需要找出導致它的原因。 –

+0

在你的'fn'(在開頭附近)放置一個斷點。當你進入時,在GDB中執行'p &ptr;'。讓我們假裝它回答'0x123456';做'看*(無效**)0x123456'。 –