我正在尝试将我的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。
感谢您对此问题的任何帮助。
答案 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()之前的头文件中。