[英]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.