realloc调用中的写入无效

时间:2017-08-21 19:40:25

标签: c valgrind realloc

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

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:断言`((size + offset)&(_rtld_global_ro._dl_pagesize - 1))== 0'失败&#34。我跑的时候出错了。 Valgrind告诉我在realloc调用中写入了大小为8的无效内容。发生了什么事? condition和foo是一堆文件解析的一部分,它不会使用或修改上面的任何变量。

1 个答案:

答案 0 :(得分:3)

reallocmalloc一样需要多个字节,因此您需要像以前一样将条目数乘以sizeof(size_t)

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