C-另一个结构中动态大小的结构指针数组,分段错误

C-另一个结构中动态大小的结构指针数组,分段错误,c,C,我在尝试运行这样的代码时遇到了错误 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

我在尝试运行这样的代码时遇到了错误

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;
        }
    }

}
在前两次推动后,它失败了

它应该根据节点中存储的值创建列表。但是没有。这是一个错误。当我将内存分配从“sizeod(node*)”更改为“sizeof(node)”时,它可以工作,但可能是分配更大内存的原因。我想在这个数组中存储指针,而不是结构


我花了6个小时不知道该怎么办。

如果你遇到了SEGFULT,那么你应该在问题中包含回溯。这将使我们更容易弄清楚到底发生了什么

查看代码,我发现在malloc或realloc时没有清除
result->links
,而是依赖于
pushList
中的指针为NULL。增加
list\u pointer->content
,然后检查
if(list\u pointer->links[i]==NULL)
。这肯定会导致未定义的行为

当您使用malloc或realloc时,内存不会被零填充。如果你需要这样做,你需要自己去做。(您可以使用calloc代替malloc,但这对realloc并没有帮助。)


如果您正在学习,这段代码是可以的,尽管我同意上面的评论,即这是一种有点复杂的方法。如果这是针对生产代码的,那么您应该使用开放源代码列表库,因为它已经为您调试和调优过了。

首先,请将所有代码放在一个片段中。然后添加调用这些函数的代码,这是一种混乱的链表处理方式。它不应该是链表-我想搜索O(logn),所以我需要它们作为数组,用于binsearch。正如您所看到的,我正在对它们进行排序。我想我看到了您的问题,您正在分配(并重新分配)
list\u pointer->links
,在这样做之后,您只需假设该数组中的所有指针都将为
NULL
。这是一个错误,新分配的内存没有隐式归零,您的代码将试图使用这些错误的指针并崩溃。关闭。非常感谢
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);