【问题标题】:I don't think I fully understand realloc, can someone explain to me why a realloc in my code sometimes fails but sometimes doesn't我不认为我完全理解 realloc,有人可以向我解释为什么我的代码中的 realloc 有时会失败但有时不会
【发布时间】:2020-09-12 03:46:01
【问题描述】:

我正在为这个更大的程序用 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 stamens 然后使用 lldb 调试此代码,似乎 push_to_vec 函数中的 realloc 调用是失败的行。

任何帮助将不胜感激,并提前致谢。

【问题讨论】:

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

标签: c memory-management realloc


【解决方案1】:

您没有分配足够的空间。

realloc 的第二个参数是要分配的大小以字节为单位,而不是数组元素的数量。结果,您正在写超过调用undefined behavior的分配内存的末尾

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 2014-11-10
    相关资源
    最近更新 更多