ошибка сегментации простого связанного списка - PullRequest
0 голосов
/ 01 июня 2011

Я новичок в языке программирования 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 ]

3 голосов
/ 01 июня 2011

Дружище, вы не распределили память и пытаетесь сохранить в ней значение . Вам нужно использовать malloc () , чтобы сначала выделить память и сделать указатель структуры на нее указателем и тогда только вы можете работать впереди.

Объявление структуры не выделяет память для ее элементов. Вы должны сделать это.

int main()
{  

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

}
2 голосов
/ 01 июня 2011

Один из способов отладки это знакомство с gdb

Сначала включите дамп ядра с помощью этой команды:

ulimit -c unlimited 

и скомпилируйте вашу программу с флагом -g, чтобы включитьотладочная информация.

Затем запустите исполняемый файл, в результате чего основной файл будет помещен в ту же папку, что и исполняемый файл.

Сейчас.Запустите GDB, используя

gdb ./program core

Теперь GDB должен распечатать сообщение об ошибке и точное местоположение.

0 голосов
/ 01 июня 2011

Самое очевидное: вы присваиваете NULL для ue, а затем разыменовываете ue. Это неопределенное поведение; сначала вы должны выделить память.

0 голосов
/ 01 июня 2011

Если ваш вопрос касается того, как отладить проблему, вам следует использовать отладчик, например GDB . Во-первых, убедитесь, что вы скомпилировали свою программу с отладочной информацией (убедитесь, что вы вызываете GCC с флагом -ggdb и без каких-либо оптимизаций). Затем вызовите GDB с:

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

Затем введите run (или r для краткости), чтобы начать выполнение. Когда программа падает, информация об ошибке сегмента будет отображаться в GDB. Введите backtrace (или bt для краткости), чтобы получить трассировку стека, т. Е. Какие функции и номера строк используются при возникновении сбоя.

...