2012-11-28 127 views
-1

我試圖將我的C GNU/Linux代碼移植到FreeBSD上。起初,我認爲它不會編譯和行爲異常,但它並沒有採取行動,因爲它沒有使用其他操作系統本身不具備的功能。儘管它編譯得很好(沒有錯誤或者使用-Wall的警告),但應用程序會在GNU/Linux安裝上按照預期正常工作的線路上保持seg錯誤。將結構指針傳遞給函數segfault C FREEBSD

我正在做的是創建一個指向結構的指針,然後將指針作爲void指針傳遞給函數,然後在函數內重新創建它。

例如:

typedef struct 
{ 
    int i; 
}some_struct; 

int main() 
{ 
    some_struct *test = malloc(sizeof(some_struct)); 
    test->i = -1; 
    function(test); 

return 0; 
} 

void *function(void *prarm) 
{ 
    some_struct test = *((some_struct *)param); //segfaults on this line. 
    free(param); 


return NULL; 
} 

在我的GNU/Linux的安裝,這將讓我在本地重新創建函數內部與傳遞指針數據的結構,並讓我從main()但在FreeBSD釋放malloc版內存它seg錯誤,我不知道爲什麼。

如果我在functiongdb突破並鍵入

p *(some_struct *)param 

它成功地打印出是從指針,從函數內部它所有的變量創建我的命令結構。

爲什麼在我的FreeBSD測試機器上運行GNU/Linux和seg錯誤,我正在迷失方向。

感謝您對我遇到的這個問題的任何幫助。

+1

發佈GCC(或CLang?)標誌也會有幫助。 – 9000

+1

這不是真正的代碼。問題在於你省略的其他部分。 – cnicutar

+2

這段代碼甚至沒有編譯,事實上,你引用的'gdb' print cmd在你的代碼中使用了一個完全不同的結構名稱。請張貼展示問題的*真實*代碼。 – WhozCraig

回答

1

我看不出有任何理由要段錯誤,特別是如果-Wall是沉默。

有一件令我困擾的事情是,在main()的呼叫點沒有明顯的聲明對function()生效。沒有聲明,C假定參數是作爲整數傳遞的,所以應該給出警告。你可以通過幾種方式修復這個問題—在main()之上添加一個函數聲明,將函數定義移到main之上,或者將聲明放在main()之前的頭文件中。

+0

對不起,我更新了一些我的真實代碼(最好我可以不發佈1300行代碼) –

2

這很奇怪,這會失敗。您是否嘗試過重新排序的功能或使用前聲明function(前主):

void *function(void *prarm); 
+0

由於@wallyk陳述的原因。 – jimhark

2

您正在創建一個非常大棧幀:

char buff[3000600], data[3000000], url[1024], c[1]; 

這幾乎是6MB - 也許你已超出在FreeBSD默認的進程堆棧大小的限制? FreeBSD使用SIGSEGV來殺死一個超過這個限制的進程,當你寫入一個本地變量時會檢測到這個變量,這會導致堆棧超出限制。您可以調整login.conf中的堆棧大小限制。