不使用全局列表时C列表的分段错误



我写了一些代码,创建了一个单链表,然后在C.中将其转换为动态数组

如果我只为列表头创建一个全局变量,代码就可以正常工作。然而,如果我想在我的主函数中创建列表,我总是会遇到分段错误。

只要我创建一个全局列表变量并从所有函数中删除列表作为参数,下面的代码就可以正常工作。

如果我想将列表作为参数传递给函数,从而能够创建多个列表,有人能告诉我为什么这不起作用吗?


#include <stdlib.h>
#include <stdio.h>
typedef struct NodeStruct* Node;
typedef struct NodeStruct {
Node next;
int val;
} NodeStruct;
typedef Node List;

Node newNode(int x){
Node n = (Node)malloc(sizeof(NodeStruct));
if(n!=NULL){
n->val = x;
n->next = NULL;
return n;
}
else{
printf("ERROR: Could not allocate memory!n");
}
exit(1);
}
void prepend(List l, Node node){
if (l == NULL) l = node;
else{
node->next = l;
l = node;
}
}
void printList(List l){
if(l!=NULL){
Node n = l;
while(n->next != NULL){
printf("%d, ", n->val);
n = n->next;
}
printf("%dn", n->val);
}
else{
printf("ERROR: List empty!n");
}
}

/*=============================*/
int* arrOf(List l){
if(l==NULL){
printf("ERROR: List emptyn");
exit(1);
}
int size = 0;
Node n = l;
while(n!=NULL){
size++; 
n = n->next;
}

int* arr = (int*)malloc((size+1)*sizeof(int));
n = l;
int i = 0;
arr[i++] = size;
while(n != NULL){
arr[i++] = n->val;
n = n->next;
}
printf("Returning Arrayn");
return arr;
}

int main(int argc, char *argv[]){
List l;

prepend(l, newNode(5));
prepend(l, newNode(6));
prepend(l, newNode(7));
prepend(l, newNode(8));
prepend(l, newNode(9));
prepend(l, newNode(4));

printList(l);
printf("n===========================================n");

int* arr = arrOf(l);
for(int i = 0; i < 10; ++i){
printf("%d, ", arr[i]);
}
return 0;
}

main中初始化List l时,不会分配默认值。它存储在堆栈中,并且未初始化。这意味着该值未定义,不一定为null。

全局创建List l时,变量存储在bss段中,并用null初始化。

将您的List l申报更改为:

List l = NULL;

此函数

void prepend(List l, Node node){
if (l == NULL) l = node;
else{
node->next = l;
l = node;
}
}

处理主中声明的指针l的值的副本

List l;

而且没有初始化。

因此,在函数内更改这些语句中的副本

if (l == NULL) l = node;
//...
l = node;

不影响在main中声明的指针的原始值。

你必须至少像一样写作

void prepend(List *l, Node node){
node->next = *l;
*l = node;
}

并且在主中

List l = NULL;

该函数可以像一样调用

prepend( &l, newNode(5) );

即指向头节点的指针必须通过引用传递给函数。

此外,您还需要为列表和数组释放所有动态分配的内存。

相关内容

  • 没有找到相关文章

最新更新