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

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函数返回新分配的值,因此需要在调用函数中使用该值。
pkt =create_pkt(pkt);
否则,程序将忽略指向已分配内存的指针,并使用pkt的原始(未分配)值。
编辑:如果要将参数用作赋值对象,可以编写如下内容

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

并称之为
create_pkt(&pkt);

但我不能真的推荐。

10-07 17:43