我正在尝试将我的 C GNU/Linux 代码移植到 FreeBSD。起初我以为它不会编译和异常,但它没有对我起作用,因为它没有使用其他操作系统没有本机的功能。虽然它编译得很好(使用-Wall
没有错误或警告),但应用程序在GNU/Linux安装上正常工作的行上保持seg错误。
我正在做的是创建一个指向结构的指针,然后将指向函数的指针作为 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()
中释放malloc
ed内存,但在 FreeBSD 上它会出现 seg 错误,我不知道为什么。
如果我在gdb
中function
中断并键入
p *(some_struct *)param
它成功地打印出从指针创建的命令结构及其从函数内部创建的所有变量。
我不明白为什么这在我的 FreeBSD 测试机器上工作 GNU/Linux 和 seg 错误。
感谢您对我遇到的这个问题的任何帮助。
这很奇怪,这会失败。您是否尝试过在使用前(在 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() 之前包含的头文件中。