【问题标题】:segmentation fault when freeing the buffer after sendto()在 sendto() 之后释放缓冲区时出现分段错误
【发布时间】:2013-03-13 16:11:23
【问题描述】:

在函数sendto() 之后释放缓冲区'pkt' 时出现分段错误

u_char* create_pkt(u_char* pkt)
{
  ....
  pkt = (u_char *)malloc(40);
  ...
  return pkt
}


int main()
{
 ....
 u_char* pkt;
 create_pkt(pkt);
 if (sendto(sd, pkt, 40, 0, (struct sockaddr *)&sin, sizeof(struct sockaddr)) < 0)
 free(pkt);
 }

调试信息显示:

Program received signal SIGSEGV, Segmentation fault.
0x0000003897482864 in __GI___libc_free (mem=0x7fffffffe010) at malloc.c:2986

这有什么问题?谢谢!

2986      ar_ptr = arena_for_chunk(p);
2986      ar_ptr = arena_for_chunk(p);

【问题讨论】:

  • 为什么create_pkt() 还要争论?

标签: c linux segmentation-fault


【解决方案1】:

create_pkt 函数返回新分配的值,因此您需要在调用函数中使用它。

pkt =create_pkt(pkt);

否则程序将忽略指向已分配内存的指针并使用pkt的原始(未分配)值。

编辑:如果你想使用参数作为赋值的东西,你可以写这样的东西

void create_pkt(u_char** pkt)
{
  ....
  *pkt = (u_char *)malloc(40);
  ...
}

并调用它

create_pkt(&pkt);

但我真的不建议这样做。

【讨论】:

  • 啊,是的,所以这意味着我的函数应该是 u_char* create_pkt() 而不是 u_char* create_pkt(u_char *)?论据没用?
  • 在当前版本中,是的。除非您使用“指针对指针”的方法来为参数赋值。在这种情况下,您将不需要返回值。请参阅对我的答案的编辑。
【解决方案2】:

u_char* create_pkt(u_char* pkt) 复制您的指针,然后在内部分配它,但只分配 copy。当函数返回时,您的原始指针仍保持原样,未分配。

现在您可以从该函数返回一个指针,也可以传入一个双指针u_char** pkt 并将pkt 的地址分配给它。

pkt = create_ptk(pkt); 现在你已经分配了pkt。

对于双指针版本,您可以这样称呼它:

create_pkt(&amp;pkt);

【讨论】:

    【解决方案3】:

    您正在尝试分配内存并丢失分配的引用。所以垃圾被发送,然后尝试释放杀死它。

    u_char* create_pkt()
    {
       u_char* pkt;
       ....
       pkt = (u_char *)malloc(40);
      ...
       return pkt;
    }
    
    
    int main()
    {
       ....
       u_char* pkt;
       pkt = create_pkt();
       if (sendto(sd, pkt, 40, 0, (struct sockaddr *)&sin, sizeof(struct sockaddr)) < 0)
       free(pkt);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多