【问题标题】:passing a struct pointer to a function segfault C FREEBSD将结构指针传递给函数段错误 C FREEBSD
【发布时间】:2012-11-28 06:32:19
【问题描述】:

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

如果我在gdb 中打断function 并输入

p *(some_struct *)param

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

我不知道为什么这是在我的 FreeBSD 测试机器上运行的 GNU/Linux 和段错误。

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

【问题讨论】:

  • 发布 GCC(或 CLang?)标志也会有所帮助。
  • 这不是真正的代码。问题出在您省略的其他部分。
  • 此代码甚至无法编译,事实上,您引用的 gdb print cmd 使用与您发布的代码完全不同的结构名称。请发布出现问题的真实代码。
  • @cnicutar:很抱歉没有发布实际代码。到目前为止,整个项目有 1300 行长,我不想用无用的代码淹没你们。我试图将我的代码最小化为我如何调用我的函数和函数本身。希望这可以帮助你们更好地帮助我。感谢收看。
  • @randynewfield,speedtest_cmd 是否在您的标题之一(或您遗漏的代码中)声明?如果不是,您应该尝试添加声明。您要构建什么架构?

标签: c linux segmentation-fault freebsd


【解决方案1】:

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

void *function(void *prarm);

【讨论】:

  • 出于@wallyk 所述的原因。
【解决方案2】:

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

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

差不多 6MB - 也许您超出了 FreeBSD 上默认的进程堆栈大小限制? FreeBSD 使用SIGSEGV 来杀死超过此限制的进程,当您写入会导致堆栈扩展超出限制的局部变量时会检测到它。您可以在login.conf 中调整堆栈大小限制。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 抱歉,我更新了一些我的真实代码(尽可能不发布 1300 行代码)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 2020-05-15
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多