我明白了:
LLIST *mylist[N];
其中N是输入文件的行数。然后mylist[i]
是指向第i个链表的指针。
我调用一个函数
LLIST *list_add(LLIST **p, int i){
LLIST *n;
n = (LLIST *) malloc(sizeof(LLIST));
if (n == NULL)
return NULL;
n->next = *p; /* the previous element (*p) now becomes the "next" element */
*p = n; /* add new empty element to the front (head) of the list */
n->data = i;
return p;
}
所以在我的主要内容我说的是
LLIST *mylist[N];
list_add(&mylist[0],1);
list_add(&mylist[0],2);
list_add(&mylist[1],3)
list_add(&mylist[1],4);
list_print(mylist[0]); // Print mylist[0]
list_print(mylist[1]); // Print mylist[1]
我的Print_list功能是:
Void *list_print(LLIST *n) {
if (n == NULL){
printf("list is empty\n");
}
while (n != NULL){
printf("%d",n->data);
n = n->next;
}
}
当我执行list_print(mylist[0])
时,会打印出2 1
。
当我list_print(mylist[1])
时,我遇到了分段错误。
发生了什么事?
答案 0 :(得分:1)
您似乎没有初始化mylist
数组的内容,它可能包含指向随机内存位置的值。当只添加新元素时无关紧要,在开头插入新元素,从不访问无效指针。但是当您尝试打印列表时,打印功能将跟随列表末尾的无效指针并产生分段错误。
为避免这种情况,请在数组声明中添加初始值设定项:
LLIST *mylist[N] = {NULL};
这会将mylist
的所有元素设置为NULL
。
答案 1 :(得分:0)
这确实有效LLIST * mylist [10] = {NULL}; 但如果我想这样做,我会得到错误:
X = 10; LLIST * mylist [x] = {NULL};