2012-02-21 145 views
1

我试图定义一个节点struct,其中包含一个节点* next。我写了一个append(node* n)函数来在前​​一个节点旁边添加一个新节点,但是每次运行代码时,都会导致seg故障。我的代码如下:指针malloc失败

#include<stdlib.h> 
#include<stdio.h> 


typedef struct _log_t { 
    struct _log_t* next; 
}log_t; 

void initi(log_t* l) { 
    l = (log_t*)malloc(sizeof(log_t)); 
    l -> next = NULL; 
} 

void append(log_t* l){ 
    l->next = (log_t*)malloc(sizeof(log_t)); 
    l->next->next = NULL; 
    l = l->next; 
} 

在此先感谢您的帮助!

回答

6
l = l->next; 

这条线是不是做你认为它是 - 事实上,它什么都不做。

也许你想通过log_t *作为log_t**,或返回新的log_t*

+0

完全正确:) – paulsm4 2012-02-22 00:06:35

-2

您取消引用您从未初始化的指针。这就是为什么它的崩溃:)

// OK (but you should check for malloc() failing, too!) 
void initi(log_t* l) { 
    l = (log_t*)malloc(sizeof(log_t)); 
    l -> next = NULL; 
} 

void append(log_t* l){ 
    // OK... 
    l->next = (log_t*)malloc(sizeof(log_t)); 
    // BAD!!!! l->next: allocated. l->next->next: *NOT* initialized! 
    l->next->next = NULL; 
    l = l->next; 
} 

这就是我认为可能平均:

log_t * append (log_t* l) { 
    // Initialize the head 
    if (l == NULL) { 
    l = (log_t *)malloc(sizeof (log_t)); 
    l->next = NULL; 
    } 
    // Initialize a sub-node 
    else { 
    l->next = (log_t *)malloc(sizeof (log_t)); 
    l->next->next = NULL; 
    } 
    // Always return the head 
    return l; 
} 
+0

喜只是做了initalization ......完美的罚款。没有取消引用。 – 2012-02-21 23:52:04

+0

更新更糟.. append(NULL)..这只是没有任何意义。 – 2012-02-21 23:56:48

+0

@yi_H:关键是你不能解除引用“l-> next-> next”,直到你已经分配了“l”和2)初始化“l-> next”。将l-> next初始化为NULL或新分配的值是非常合适的。它*不*可以使用它* *之前*你已经初始化它。 – paulsm4 2012-02-22 00:04:48