2011-12-22 92 views
2

當指針指向本地時,指針出現段錯誤。該程序太長以至於無法複製到此處,但它是這樣的:當指針爲本地時出現分段錯誤

void f(){ 
    int* p; 
    int n = 0; 
    for (...) { 
     n++; 
     p = realloc(p, n * sizeof(int)); 
     if (p == NULL) error(); 
    } 
    //Code using the pointer 
    free(p); 
} 

int main() { 
    f(); 
    puts("Finish"); 
} 

puts(「Finish」);被執行,但在此之後我收到了分段錯誤。

如果我聲明p爲全局函數之前,它的功能完美無缺,這個問題得到解決,但我不知道爲什麼會發生這種情況。

運行調試程序我看不出問題出在哪裏,所有的值都沒問題。這是故障後的痕跡:

Program received signal SIGSEGV, Segmentation fault. 
0x000000361206dbd1 in _IO_flush_all_lockp() from /lib64/libc.so.6 
(gdb) bt 
#0 0x000000361206dbd1 in _IO_flush_all_lockp() from /lib64/libc.so.6 
#1 0x000000361206e725 in _IO_cleanup() from /lib64/libc.so.6 
#2 0x00000036120334b2 in exit() from /lib64/libc.so.6 
#3 0x000000361201d99b in __libc_start_main() from /lib64/libc.so.6 
#4 0x0000000000400ce9 in _start() 

以防萬一這可能是一個問題,it's的多進程應用程序(叉,execv,等...),提前爲你的答案

謝謝

回答

6

看起來像你不打算初始化p - 與全局變量它將被隱式地初始化爲0,但本地變量不是。所以你最終調用realloc /免費的隨機垃圾指針腐敗的堆,並導致以後崩潰...

初始化p,並應該解決它。

+1

謝謝,那就是問題所在。一個簡單的int * p = NULL修復了它。 – Evans 2011-12-22 01:38:50

1
int* p; 
// ... 
for (...) { 
//... 
     p = realloc(p, n * sizeof(int)); 

在循環的第一次迭代中,p值不明確的,因爲你沒有初始化它。這是一個錯誤。不確定這是你問題的原因,但我會先解決它,看看問題是否仍然存在。

0

您應該檢查文檔realloc。它可在這裏:

http://pubs.opengroup.org/onlinepubs/7908799/xsh/realloc.html

帶走的事情是,調用realloc()NULL指針(指向爲0,即一個指針)是有效的。但是,使用未使用malloccalloc獲得的非空指針調用它會導致「未定義」行爲。

那麼,爲什麼這很重要?因爲當你在全局範圍內聲明p時,它將被初始化爲0(即NULL)。當它在本地範圍內聲明時,這不會/可能不會發生。相反,如果你沒有明確地初始化它,它會有一些任意的初始值,並且這會引起前面提到的「未定義的行爲」。

相關問題