gpt4 book ai didi

c - realloc:释放对象的无效校验和

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

我在使用 realloc 替换 malloc 时出错。

下面这段代码在我的电脑上运行正常。

int vector_grow(Vector* vec) {
unsigned long newcap;
int * newarr;

if (0 == vec->cap) {
vec->arr = (int*)malloc(START_CAPACITY * sizeof(*vec->arr));
if (NULL == vec->arr)
return -1;
vec->cap = START_CAPACITY;
return 0;
}
newarr = malloc (newcap * sizeof(*vec->arr));
if (NULL == newarr)
return -1;

memcpy (newarr, vec->arr, vec->len * sizeof(*vec->arr));
free (vec->arr);
vec->arr = newarr;
vec->cap = newcap;

return 0;
}

我想把malloc改成realloc,但是报错了。

int vector_grow(Vector* vec) {
unsigned long newcap;

if (0 == vec->cap) {
vec->arr = (int*)malloc(START_CAPACITY * sizeof(*vec->arr));
if (NULL == vec->arr)
return -1;
vec->cap = START_CAPACITY;
return 0;
}
newcap = 2 * vec->cap;
if ((vec->arr = (int*)realloc(vec->arr, newcap * sizeof(int))) == NULL)
return -1;
return 0;
}

它说

malloc: *** error for object 0x7fca64c02598: incorrect checksum for freed object - object was probably modified after being freed.

我不知道这两段代码之间有什么区别,如果您知道导致错误的原因,请告诉我!非常感谢!

最佳答案

更新代码中缺少 vec->cap = 的错误肯定会导致对 malloc() 的各种调用以及调用代码对数据的滥用。

int vector_grow(Vector* vec) {
unsigned long newcap;

if (0 == vec->cap) {
... // not important to show the bug
}
newcap = 2 * vec->cap;
if ((vec->arr = (int*)realloc(vec->arr, newcap * sizeof(int))) == NULL)
return -1;

// Add missing update
vec->cap = newcap;

return 0;
}

也更好地测试分配是否成功

  void *p = realloc(vec->arr, sizeof *(vec->arr) * newcap);
if (p == NULL) {
return -1;
}

vec->arr = p;
vec->cap = newcap;

关于c - realloc:释放对象的无效校验和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45989309/

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