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;
   ....
   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 に答える
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 に答える