2013-03-13 2 views
1

내가 세그먼트 오류를 ​​얻을 수 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); 
+0

왜 'create_pkt()'가 인수를 사용하는 이유는 무엇입니까? – NPE

답변

2

create_pkt 기능은 새로 할당 된 값을 반환합니다.create_pkt(pkt);

pkt =

그렇지 않으면, 프로그램은 할당 된 메모리에 대한 포인터를 무시하고 pkt의 원래 (할당되지 않은) 값을 사용한다.

편집 : 당신이, 당신이

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

같은 것을 쓰고

create_pkt(&pkt); 

로 호출 할 수 있습니다에 값을 할당 할 무언가로 인수를 사용하고 싶지만 만약 그럴 수 없어 정말로 그것을 권고하십시오.

+0

아, 그래, 내 함수가 u_char * create_pkt()가 아니라 u_char * create_pkt (u_char *)가되어야 함을 의미합니까? 그 논쟁은 쓸모가 없다? – user1944267

+0

현재 버전에서는 yes입니다. 인수에 값을 할당 할 수있는 "포인터에 포인터"접근 방식을 사용하지 않는 한. 이 경우 리턴 값이 필요 없습니다. 내 대답에 편집 참조하십시오. –

0

u_char* create_pkt(u_char* pkt)은 포인터를 복사 한 다음 내부에 할당하지만 복사본 만 할당합니다. 함수가 원래의 포인터를 반환 할 때 그대로 남아 있습니다.

이제이 함수에서 포인터를 반환하거나 u_char** pkt 더블 포인터를 전달하고 pkt의 주소를 할당 할 수 있습니다.

pkt = create_ptk(pkt); 이제 pkt가 할당됩니다. 이중 포인터 버전

이 당신이 그것을 호출 할 줄하는 방법이다 : 당신은 메모리를 할당하려고 노력하고 할당 된 참조를 잃어버린하는

create_pkt(&pkt);

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); 
}