2011-11-25 55 views
3

我有一個函數realloc的86 x86_64的

void *srealloc(void * ptr , int size){ 
    void *tmp = realloc(ptr , size); 
    if(tmp == NULL){ 
     fprintf(stderr,"realloc of %u bytes failed", size); 
     exit(1); 
    } 
    return tmp; 
} 

我的代碼調用此運行在x86計算機上很好,但是當我編譯和我的x64計算機上運行相同的代碼,我收到了段錯誤。

正在被呼叫的如何一個例子是:

line = "Some string"; 
buffer = (char**) srealloc (buffer,sizeof(buffer)*(++buffer_lines)); 
buffer[buffer_lines-1] = line; 

當我用gdb跟蹤通過時srealloc被稱爲計算機段錯誤PTR ==爲0x0上,大小== 8

*編輯: 段錯誤發生在:

void *tmp = realloc(ptr, size); 
+1

如何聲明緩衝區? – zneak

+0

行是char * – LeeG

+0

請注意'sizeof(buffer)'是指向char_的指針的_pointer的大小。爲了正確,你應該使用'sizeof(char *)'。這裏並不重要,因爲指向一種類型的指針的大小與指向另一種類型的指針的大小相同,只是想指出這一點。 –

回答

3

你的通話看起來很好。在malloc(),realloc(),calloc()free()中發生崩潰通常是程序中其他位置的錯誤的一種症狀,您在該位置寫入的內容超出了已分配塊的範圍,並且被記憶體分配函數使用的內務處理信息踩踏。

嘗試在像Valgrind或Purify這樣的工具下運行您的程序。

+0

運行Valgrind後,發現'cp *'未初始化時,我有'strncpy(cp,line,strlen(line)+1)'。當我稱之爲realloc時,我認爲這會導致一些粉碎。 Valgrind是一個很好的電話。 – LeeG

0

確保調用realloc的代碼具有該函數的有效原型(換句話說,包括stdlib.h)。

從32位切換到64位的許多問題涉及到整數(如果沒有原型時是默認參數)和指針之間的不一致。雖然整數可能停留在64位平臺上的32位,但指針的大小可能會增加。

由於您聲明指針爲NULL並且請求的大小爲8,所以這當然可以有效地使用該函數。空指針的realloc與malloc實際上是一樣的。這就是爲什麼我懷疑原型問題。

另外,請確保您在新機器上編譯的一切。如果您嘗試將32位編譯的srealloc鏈接到64位編譯的客戶端,則可能會出現問題。

+0

運行Valgrind後,事實證明發送垃圾指針到'strncpy()'搞亂了我的堆。這並不能解釋爲什麼我的代碼在x86計算機上運行,​​但我很高興我找到了這個錯誤的原因。 – LeeG