在 realloc 调用中写入无效

Invalid write in realloc call

我在使用这段代码时遇到了一些问题。

size_t* defines = malloc(sizeof *defines);
if (!defines)
    exit(1);

size_t def_cap = 1;
size_t def_size = 0;

...

for(condition) {
    ...

    if (def_size == def_cap) {
        void* tmp = realloc(defines, def_cap*=2);
        if(!tmp)
            exit(1);
        defines = tmp;
    }
    defines[def_size++] = foo;
}

我在 运行 时遇到 "malloc.c:2842: mremap_chunk: Assertion `((size + offset) & (_rtld_global_ro._dl_pagesize - 1)) == 0' failed." 错误。 Valgrind 告诉我在 realloc 调用中有一个大小为 8 的无效写入。这是怎么回事? condition 和 foo 是一堆文件解析的一部分,不使用或修改上述任何变量。

reallocmalloc 一样占用多个字节,所以你需要像以前一样将条目数乘以 sizeof(size_t)

def_cap *= 2;
void* tmp = realloc(defines, def_cap * sizeof *defines);