我是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;
}
答案 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
标志编译您的程序以启用调试信息。
然后运行可执行文件,这将导致核心文件放在与可执行文件相同的文件夹中。
现在。使用
启动gdbgdb ./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。这是未定义的行为;你首先必须分配内存。