gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:42:18 24 4
gpt4 key购买 nike

我在尝试运行此类代码时出现段错误。

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)”时,它起作用了,但可能是分配更大内存的原因。我想在此数组中存储指针,而不是结构。

我想了 6 个小时,不知道该做什么。

最佳答案

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

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

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

如果您正在学习,这段代码很好,但我同意上面的评论,即它的实现方式有点复杂。如果这是用于生产代码,那么您应该使用开源列表库,因为它已经为您调试和调整。

关于C - 另一个结构中的动态大小的结构指针数组,段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30550005/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com