我在尝试运行此类代码时遇到了段错误。
struct list;
struct node;
typedef struct list {
struct node ** links;
int size;
int content;
} list;
typedef struct node {
wchar_t value;
struct list* children;
int exists;
} node;
node* newNode(wchar_t value, int exists) {
node *q = (struct node*)malloc(sizeof(struct node));
q->value = value;
q->children = newList();
q->exists = exists;
return q;
}
list* newList(){
list *result = (list*)malloc(sizeof(list));
result->size = 2;
result->content = 0;
result->links = (struct node**) malloc(result->size * sizeof(struct node*));
return result;
}
void resizeList(list* list_pointer){
if(list_pointer->size <= list_pointer->content){
list_pointer->size *= 2;
list_pointer->links = (struct node**) realloc(list_pointer->links, (list_pointer->size) * sizeof(struct node*));
}
}
void pushList(list* list_pointer, node* node_pointer){
if(node_pointer == NULL)
return;
resizeList(list_pointer);
list_pointer->content++;
int i;
node* temp_pointer;
for(i = 0; i < list_pointer->content; i++){
if(list_pointer->links[i] == NULL){
list_pointer->links[i] = node_pointer;
break;
}
if(list_pointer->links[i]->value > node_pointer->value){
temp_pointer = list_pointer->links[i];
list_pointer->links[i] = node_pointer;
node_pointer = temp_pointer;
}
}
}
呼叫。
struct list* l = newList();
struct node* n1 = newNode(L'a', 1);
struct node* n2 = newNode(L'b', 1);
struct node* n3 = newNode(L'c', 1);
struct node* n4 = newNode(L'd', 1);
struct node* n5 = newNode(L'e', 1);
struct node* n6 = newNode(L'f', 1);
struct node* n7 = newNode(L'g', 1);
struct node* n8 = newNode(L'h', 1);
pushList(l, n1);
pushList(l, n2);
pushList(l, n3);
pushList(l, n4);
pushList(l, n5);
pushList(l, n6);
pushList(l, n7);
pushList(l, n8);
前两次推后失败。
应该根据存储在节点中的值创建列表。但是......事实并非如此。它引发了段错误。当我将内存从“sizeod(node *)”更改为“sizeof(node)”时,它可以工作,但可能是分配更大内存的原因。我想在这个数组中存储POINTERS而不是STRUCTS。
我想要6个小时,不知道该怎么做。
答案 0 :(得分:2)
如果您遇到段错误,那么您应该在问题中包含回溯。这将使得弄清楚发生了什么变得容易得多。
查看代码,我看到你在malloc或realloc时没有清除result->links
,但你依赖pushList
内的指针为NULL。您增加list_pointer->content
,然后检查if (list_pointer->links[i] == NULL)
。这肯定会导致未定义的行为。
使用malloc或realloc时,内存未填充零。如果你需要那样的话,你需要自己做。 (您可以使用calloc作为malloc的替代品,但这对realloc没有帮助。)
如果你正在学习这个代码就没问题了,尽管我同意上面的评论,这是一个令人费解的方式。如果这是用于生产代码,那么您应该使用开源列表库,因为它已经为您调试和调整。