简单链表分段故障

时间:2011-06-01 10:20:50

标签: c linked-list segmentation-fault

我是C编程语言的新手。

我正在学习关于链表的C,试图打印“hello world”,但是我遇到了分段错误。

我正在使用文本编辑器(vi)和gcc。如何跟踪错误,哪个部分导致分段错误,以及如何解决此问题?

我应该把printf放在每行吗? 我希望得到任何帮助/一些建议

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

4 个答案:

答案 0 :(得分:3)

Buddy你还没有分配内存并试图在其中存储值。你需要使用 malloc()来首先分配内存并使结构指针指向它只有你可以提前工作。

声明结构不会为其元素分配内存。您必须这样做。

int main()
{  

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

}

答案 1 :(得分:2)

调试此方法的一种方法是熟悉gdb

首先使用此命令启用核心转储:

ulimit -c unlimited 

并使用-g标志编译您的程序以启用调试信息。

然后运行可执行文件,这将导致核心文件放在与可执行文件相同的文件夹中。

现在。使用

启动gdb
gdb ./program core

gdb现在应该打印出有关错误和确切位置的消息。

答案 2 :(得分:0)

如果您的问题是关于如何调试问题,那么您应该使用调试器,例如GDB。首先,确保使用调试信息编译程序(确保使用-ggdb标志调用GCC,并且未启用任何优化)。然后,使用以下命令调用GDB:

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

然后输入run(或简称r)开始执行。程序崩溃时,seg-fault信息将显示在GDB中。键入backtrace(或简称为bt)以获取堆栈跟踪,即崩溃发生时您所处的功能和行号。

答案 3 :(得分:0)

最明显的是:你给ue分配NULL,然后解除引用ue。这是未定义的行为;你首先必须分配内存。