簡體   English   中英

將結構指針傳遞給函數段C FREEBSD

[英]passing a struct pointer to a function segfault C FREEBSD

我試圖將我的C GNU / Linux代碼移植到FreeBSD。 起初,我認為它不會編譯並異常運行,但是它並沒有對我起作用,因為它沒有使用其他操作系統沒有的本機功能。 盡管它可以正常編譯(使用-Wall不會出現錯誤或警告),但該應用程序會在正常運行GNU / Linux安裝的行上保持段錯誤。

什么我做的是創建一個指向一個結構,然后使指針功能空指針,然后重新創建它里面的功能。

例如:

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()釋放malloc內存,但是在FreeBSD上它會出現段錯誤,我不知道為什么。

如果我在gdb中的function中斷並輸入

p *(some_struct *)param

它成功打印了我從指針創建的命令結構以及從函數內部創建的所有變量。

我不知道為什么它能正常工作GNU / Linux並在FreeBSD測試機上出現段錯誤。

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

這將失敗是很奇怪的。 您是否嘗試過在使用前(在main之前)重新排序功能或聲明function

void *function(void *prarm);

您正在創建一個非常大的堆棧框架:

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

將近6MB-也許您超出了FreeBSD上默認的進程堆棧大小限制? FreeBSD使用SIGSEGV殺死超過此限制的進程,並且在您寫入導致堆棧擴展超出該限制的局部變量時將檢測到該進程。 您可以在login.conf調整堆棧大小限制。

我看不出有任何原因導致段錯誤,特別是在-Wall保持沉默的情況下。

讓我感到困擾的一件事是,在main()的調用點上沒有明顯的聲明對function() 如果沒有聲明,C會假定參數以整數形式傳遞,因此應給出警告。 您可以通過幾種方式解決此問題:在main()上方添加函數聲明,將函數定義移至main之上,或將聲明放入main()之前的頭文件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM