1

'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);
4

3 回答 3

2

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

pkt =create_pkt(pkt);

否则程序将忽略指向已分配内存的指针并使用pkt.

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

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

并调用它

create_pkt(&pkt);

但我真的不建议这样做。

于 2013-03-13T16:13:55.893 回答
0

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

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

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

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

create_pkt(&pkt);

于 2013-03-13T16:14:23.380 回答
0

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

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);
}
于 2013-03-13T16:16:23.157 回答