-1

我正在尝试将我的 C GNU/Linux 代码移植到 FreeBSD。起初我以为它不会编译和运行异常,但它并没有对我起作用,因为它没有使用其他操作系统不具备的功能。尽管它编译得很好(使用 没有错误或警告-Wall),但应用程序在 GNU/Linux 安装上按预期正常工作的线路上保持段错误。

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

如果我闯入functiongdb输入

p *(some_struct *)param

它成功地打印出我的命令结构,该结构是从函数内部的指针及其所有变量创建的。

我对为什么这在我的 FreeBSD 测试机器上运行 GNU/Linux 和段错误感到迷茫。

感谢您对我遇到的这个问题的任何帮助。

4

3 回答 3

2

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

void *function(void *prarm);
于 2012-11-28T06:38:21.507 回答
2

您正在创建一个非常大的堆栈框架:

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

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

于 2012-11-28T07:42:25.273 回答
1

我看不出它有任何发生段错误的理由,尤其-Wall是在沉默的情况下。

对此困扰我的一件事是,function()在调用main(). 如果没有声明,C 假定参数是作为整数传递的,因此应该给出警告。您可以通过多种方式解决此问题——在 main() 之上添加函数声明,将函数定义移至 main 之上,或将声明放在 main() 之前包含的头文件中。

于 2012-11-28T06:39:23.480 回答