我不知道';我不认为我完全理解realloc,有人能向我解释为什么我的代码中的realloc有时会失败,但有时不会';T

我不知道';我不认为我完全理解realloc,有人能向我解释为什么我的代码中的realloc有时会失败,但有时不会';T,c,memory-management,realloc,C,Memory Management,Realloc,我正在为这个较大的程序用C编写一个非常简单的列表数据类型(效率非常低,但它可以工作),但根据我使用代码的方式,有时会出现分段错误,但如果我的输入数据稍有不同,代码就可以了 令人不快的部分是: struct Vec { int size; Node* ptr; }; void push_to_vec(struct Vec* root, Node to_push) { root -> size ++; root -> pt

我正在为这个较大的程序用C编写一个非常简单的列表数据类型(效率非常低,但它可以工作),但根据我使用代码的方式,有时会出现分段错误,但如果我的输入数据稍有不同,代码就可以了

令人不快的部分是:

struct Vec {
        int size;
        Node* ptr;
};

void push_to_vec(struct Vec* root, Node to_push) {
        root -> size ++;
        root -> ptr = realloc(root -> ptr, root -> size);
        root -> ptr[root -> size - 1] = to_push;
}
我试着用print stames调试这段代码,然后用lldb调试,似乎push_to_vec函数中的realloc调用失败了


任何帮助都将受到感谢。

您没有分配足够的空间

realloc的第二个参数是要分配的字节大小,而不是数组元素的数量。因此,您正在写入已分配内存调用的末尾

您需要将元素数乘以元素大小

root->ptr = realloc(root->ptr, root->size * sizeof(*root->ptr));

你没有分配足够的空间

realloc的第二个参数是要分配的字节大小,而不是数组元素的数量。因此,您正在写入已分配内存调用的末尾

您需要将元素数乘以元素大小

root->ptr = realloc(root->ptr, root->size * sizeof(*root->ptr));

使结构具有时间效率非常简单。您需要两个独立的整数成员:一个用于分配的元素数,另一个用于使用的元素数。现在,当使用的元素数达到分配数时,您不会将分配数增加1,而是将其乘以2。比如说,从16个元素开始,使结构具有时间效率非常简单。您需要两个独立的整数成员:一个用于分配的元素数,另一个用于使用的元素数。现在,当使用的元素数达到分配数时,您不会将分配数增加1,而是将其乘以2。比如说,从16个元素开始。