У меня есть эти четыре файла,Крошечные ошибка связанного списка в C
tinyll.c tinyll.h в/главная/пользователя/Библиотека
test.c tinyll.h в/главная/пользователя/код
и скомпилируйте эту инструкцию для создания статической библиотеки libtinyll.a и используйте ее.
; in lib
$ gcc -c tinyll.c
$ ar -cvq libtinyll.a *.o
; in code
$ gcc -o test test.c ../lib/libtinyll.a
До здесь все в порядке. Но я не знаю, почему я получаю ошибку сегментации, потому что работают строки из [CODE ERROR], но showElements. Цель - не передавать код от test.c до tinyll.c для обработки крошечного списка. Как это исправить?
/////////////////////////////////// test.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "tinyll.h"
int main(int argc, char *argv[])
{
progname = argv[0];
char *file = "fwords";
int n;
PTLL lsone = NULL;
n = loadfileinTLL(file,&lsone);
// work. good.
showElements(lsone);
// [CODE ERROR]
// Why here dont work?
// segmentation fault, load the first word
// but in the second crash.
while (lsone != NULL) {
printf("%s",lsone->word);
lsone = lsone->next;
}
return 0;
}
/////////////////////////////////// tinyll.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "tinyll.h"
void addElement(PPTLL lst, char data[])
{
PTLL elemt;
elemt = (PTLL) malloc(sizeof(TLL));
if (elemt == NULL) {
fprintf(stderr, "%s: insufficient memory.\n", progname);
exit(1);
}
if (*lst == NULL)
{
strncpy(elemt->word, data, 45);
elemt->next = NULL;
*lst = elemt;
}
else {
// add in front of list
strncpy(elemt->word, data, 45);
elemt->next = *lst;
*lst = elemt;
}
}
void showElements(PTLL lst)
{
while (lst != NULL) {
printf("%s\n",lst->word);
lst = lst->next;
}
}
int loadfileinTLL(char *filepath, PPTLL plst)
{
FILE *f;
if ((f = fopen(filepath, "r")) == NULL) {
fprintf(stderr, "%s: error to load file %s.\n", progname, filepath);
exit(1);
}
char buf[45]; int n=0;
while (fgets(buf,sizeof(buf),f) != NULL) {
char *nl;
if ((nl = strchr(buf,'\n')) != NULL) {
*nl = '\0';
}
addElement(plst,buf);
n++;
}
fclose(f);
return n;
}
//////////////////////////////////// tinyll.h
#include <stdio.h>
#include <stdlib.h>
#ifndef _TINYLL_
#define _TINYLL_
struct list {
char word[45];
struct list *next;
};
// Tiny Linked List
typedef struct list TLL;
typedef struct list *PTLL;
typedef struct list **PPTLL;
char *progname;
#endif
Выполнить код в отладчике (например. 'Gdb'). Он должен прекратить работу программы. Затем вы можете получить место, где произошел сбой кода, используя команду backtrace ('bt') и проверить переменные с помощью' print (некоторое выражение) ' –
Возможно, вы захотите использовать [include guard] (https://en.wikipedia.org/вики/Include_guard). – Jashaszun
Вы хотите сделать другой указатель, чтобы уйти из связанного списка. Если вы используете свой дескриптор в связанном списке для перемещения (то есть: 'lsone'), тогда у вас будут утечки памяти –