2012-02-21 185 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