C Ошибка сегментации в циклически связанном списке при установке следующего указателя
Я смотрел на создание циклически связанного списка в C. Единственная проблема, я не уверен, почему это создает ошибку сегментации. От операторов печати программа работает до тех пор, пока не будут установлены следующие указатели в каждом из узлов рабочей области. Был бы признателен, если кто-то может помочь мне. Спасибо
typedef struct stage stage;
/* data structure to store stage information */
struct stage
{
char name[21]; /* stage name */
stage* next; /* pointer to next stage */
int ncoins; /* number of coins in the stage */
int npipes; /* number of pipes in the stage */
};
stage * create_stage(char * line)
{
char * name;
int npipes;
int ncoins;
sscanf(line, "%s %d %d",name, &npipes, &ncoins);
printf("Name: %s NCoins:%d NPipes:%d\n",name, ncoins,npipes);
stage * s = malloc(sizeof(stage *));
strncpy(s->name,name,MAX_NAME_LEN);
s->ncoins = ncoins;
s->npipes = npipes;
printf("S Has: Name: %s NCoins:%d NPipes:%d\n",s->name, s->ncoins,s->npipes);
return s;
}
stage * find_stage(stage * root, char * str)
{
//Check that root is not null
if(root == 0){
return 0;
}
//Check the root is equal to the string
if(strncmp(root->name, str, strlen(str))){
return root;
}
stage * current = root;
//Check until it has come full circle.
while(current != root){
if(strncmp(root->name, str, strlen(str))){
return current;
}
current = current->next;
}
//Return nothing
return 0;
}
int main(void)
{
//Game Settings
char * stage1 = "garden 1 2";
char * stage2 = "hallway 1 4";
char * stage3 = "throneroom 2 8";
printf("Made strings\n");
//First node of the list
stage * stg1 = create_stage(stage1);
stage * stg2 = create_stage(stage2);
stage * stg3 = create_stage(stage3);
printf("Created stages\n");
printf("Stage 1\nName: %s nPipes: %d nCoins: %d\n",stg1->name,stg1->npipes,stg1->ncoins);
printf("Stage 2\nName: %s nPipes: %d nCoins: %d\n",stg2->name,stg2->npipes,stg2->ncoins);
printf("Stage 3\nName: %s nPipes: %d nCoins: %d\n",stg3->name,stg3->npipes,stg3->ncoins);
stg1->next = stg2;
stg2->next = stg3;
stg3->next = stg1;
printf("stages connected");
stage * foundStage = find_stage(stg1, "throneroom");
free(stg1);
free(stg2);
free(stg3);
return 0;
}
1 ответ
+ Изменить
char * name;
в
char name[MAX_NAME_LEN] ;
Когда вы используете sscanf
, name
должен указать на что-то. Если вы объявите char *name
, имя указывает никуда.
и изменить
stage * s = malloc(sizeof(stage*));
в
stage * s = malloc(sizeof(stage));
Вам нужен размер структуры stage
(sizeof(stage)
) а не размер указателя на stage
(sizeof(stage*)
). Когда вы используете sizeof(stage*)
Вы не выделяете достаточно памяти, затем, когда вы заполняете вновь выделенный этап, вы перезаписываете память, которая вам не принадлежит, и с этого момента вы получите неопределенное поведение (может произойти все что угодно).