2011-06-01 50 views
0

我是C編程語言新手。簡單鏈表分段錯誤

我正在學習關於鏈表的C,試圖打印「hello world」,但我得到了分段錯誤。

我正在使用文本編輯器(vi)和gcc。我如何追蹤錯誤,哪一部分導致分段錯誤,以及如何解決這個問題?

我應該把printf放在everyline中嗎? 我將不勝感激任何幫助/一些建議

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


typedef struct { 
int variable; 
} abc_create_t; 

typedef struct { 
int variable; 
} pdn_con_t; 

typedef struct pdn_con_list_t_slot { 
pdn_con_t conn; 
struct pdn_con_list_t_slot *next, *prev; 
} pdn_con_list_t_slot; 

typedef struct { 
pdn_con_list_t_slot *head, *tail; 
} pdn_con_list_t; 

typedef struct { 
int variable; 
pdn_con_list_t connections; 
} gprs_t; 

void send_Method(gprs_t *ue, abc_create_t *msg) 
{ 
//assert(ue->connections.head); 
printf("IN THIS BLOCK"); 
    } 

int main() 
{ 

gprs_t *ue = NULL; 
ue->variable=1; 
abc_create_t *msg = NULL; 
msg->variable=1; 
send_Method(ue, msg); 
return 0; 
    } 
+2

「你不應該遵循NULL指針,因爲混亂和瘋狂在等着你。」 (第二誡);) – mhyfritz 2011-06-01 10:29:09

回答

3

好友你還沒有在it.You分配的內存,並試圖儲值需要使用的malloc()先分配內存和使結構指針指向它,然後只有你可以繼續工作。

聲明結構不會爲其元素分配內存。您必須這樣做。

int main() 
{ 

gprs_t *ue = NULL; 
ue= (gpre_t *) malloc(sizeof(gprs_t)); 
ue->variable=1; 
//Rest of the code 

} 
+1

啊,好的,謝謝。我會嘗試先添加內存分配。從錯誤中學習:) – heike 2011-06-01 10:26:21

0

如果你的問題是關於如何調試的問題,那麼你應該使用調試器,如GDB。首先,確保你已經用調試信息編譯你的程序(確保你使用-ggdb標誌調用GCC,並且沒有啓用任何優化)。然後,調用與GDB:

gdb --args ./my_prog param1 param2 ... 

然後鍵入run(或r的簡稱)開始執行。當程序崩潰時,seg-fault信息將顯示在GDB中。鍵入backtrace(或簡稱bt)以獲取堆棧跟蹤,即崩潰發生時您正在使用的功能和行號。調試這個

2

一種方法是熟悉gdb

首先使核心與此命令轉儲:

ulimit -c unlimited 

-g標誌編譯程序啓用調試信息。

然後運行可執行文件,它將導致核心文件放置在與可執行文件相同的文件夾中。

現在。啓動gdb使用

gdb ./program core 

gdb現在應該打印出關於錯誤和確切位置的消息。

+0

謝謝你的gdb :) – heike 2011-06-01 10:36:45

0

最顯而易見的是:你將NULL分配給ue,然後解引用ue。這是未定義的行爲;你首先必須分配內存。