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

时间:2015-05-30 18:46:21

标签: 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 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个小时,不知道该怎么做。

1 个答案:

答案 0 :(得分:2)

如果您遇到段错误,那么您应该在问题中包含回溯。这将使得弄清楚发生了什么变得容易得多。

查看代码,我看到你在malloc或realloc时没有清除result->links,但你依赖pushList内的指针为NULL。您增加list_pointer->content,然后检查if (list_pointer->links[i] == NULL)。这肯定会导致未定义的行为。

使用malloc或realloc时,内存未填充零。如果你需要那样的话,你需要自己做。 (您可以使用calloc作为malloc的替代品,但这对realloc没有帮助。)

如果你正在学习这个代码就没问题了,尽管我同意上面的评论,这是一个令人费解的方式。如果这是用于生产代码,那么您应该使用开源列表库,因为它已经为您调试和调整。