2013-03-13 122 views
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); 
+0

为什么'create_pkt()'甚至需要参数? – NPE 2013-03-13 16:14:29

回答

2

create_pkt函数返回新分配的值,所以你需要使用的调用函数。

pkt =create_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 2013-03-13 16:16:27

+0

在当前版本中,是的。除非你使用“指针指针”的方法,让你给参数赋值。在这种情况下,你不需要返回值。请参阅编辑我的答案。 – 2013-03-13 16:18:11

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