将结构指针传递给函数segfault C FREEBSD

时间:2012-11-28 06:32:20

标签: c linux segmentation-fault freebsd

我正在尝试将我的C GNU / Linux代码移植到FreeBSD。起初我以为它不会编译和行为异常,但它没有对我起作用,因为它没有使用其他操作系统没有原生的功能。虽然它编译得很好(没有使用-Wall的错误或警告),但是应用程序会在GNU / Linux安装上按预期正常工作的行保留seg faulting。

我正在做的是创建一个指向结构的指针,然后将指针作为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安装上,这将允许我在函数内部使用传递的指针数据重新创建结构,并允许我从malloc释放main()内存,但在FreeBSD上它是seg错误,我不知道为什么。

如果我在function的{​​{1}}处休息并输入

gdb

它成功地打印出我从命令及其所有变量创建的命令结构。

我很遗憾为什么这会在我的FreeBSD测试机上运行GNU / Linux和seg faulting。

感谢您对此问题的任何帮助。

3 个答案:

答案 0 :(得分:2)

这会失败,这很奇怪。您是否尝试重新排序函数或在使用前声明function(在main之前):

void *function(void *prarm);

答案 1 :(得分:2)

您正在创建非常大型堆栈框架:

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

这几乎是6MB - 也许你超过了FreeBSD上的默认进程堆栈大小限制? FreeBSD使用SIGSEGV来终止超过此限制的进程,并且当您写入一个会导致堆栈超出限制的局部变量时会检测到它。您可以在login.conf中调整堆栈大小限制。

答案 2 :(得分:1)

我认为没有任何理由让它发生段错误,尤其是-Wall是静默的。

令我烦恼的一件事是,在function()的电话会话中,main()没有明显的声明生效。如果没有声明,C假定参数作为整数传递,因此应该发出警告。您可以通过多种方式解决此问题 - 在main()上面添加一个函数声明,在main上面移动函数定义,或者将声明放在main()之前的头文件中。