C为被释放的对象列出不正确的校验和

C为被释放的对象列出不正确的校验和,c,C,我正在尝试为调整大小的数组编写C结构,但遇到错误: a.out(34254,0x7fffa17b7340) malloc: *** error for object 0x7fdd39c02908: incorrect checksum for freed object - object was probably modified after being freed. *** set a breakpoint in malloc_error_break to debug [1] 3425

我正在尝试为调整大小的数组编写C结构,但遇到错误:

a.out(34254,0x7fffa17b7340) malloc: *** error for object 
0x7fdd39c02908: incorrect checksum for freed object - object was 
probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
[1]    34254 abort      ./a.out
这是我目前拥有的代码:

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <math.h>

typedef struct List {
    int length;
    int *vals; // This should be generic somehow
    int curr_inserted;
    int max_allowed; 
} List; 

List *initialize(int val) {
    List *curr; 
    curr = malloc(5 * sizeof(int));
    if (curr == NULL) {
        printf("Memory Allocation Error\n");
        exit(1);
    } else {
        curr->length = 1; 
        curr->vals = malloc(10 * sizeof(int));
        curr->vals[0] = val; 
        curr->curr_inserted = 1; 
        curr->max_allowed = 10; 
    }
    return curr; 
}
void add(List *x, int val) {
    if (x->curr_inserted == x->max_allowed) {
        int* bigger_arr = realloc(x->vals, (2 * x->max_allowed));
        x->vals = bigger_arr;
        x->max_allowed *= 2;
    }
    x->vals[x->curr_inserted] = val; 
    x->length++;
    x->curr_inserted++;
}
#包括
#包括
#包括
#包括
类型定义结构列表{
整数长度;
int*vals;//这应该是通用的
插入int curr_;
允许的int max_;
}名单;
列表*初始化(int val){
清单*货币;
curr=malloc(5*sizeof(int));
if(curr==NULL){
printf(“内存分配错误\n”);
出口(1);
}否则{
当前->长度=1;
curr->vals=malloc(10*sizeof(int));
当前->val[0]=val;
当前->当前插入=1;
当前->允许的最大值=10;
}
返回货币;
}
无效添加(列表*x,int val){
如果(x->curr\u inserted==x->max\u allowed){
int*biger_arr=realloc(x->vals,(2*x->max_允许));
x->VAL=更大的arr;
x->允许的最大值*=2;
}
x->val[x->当前插入]=val;
x->length++;
x->curr_inserted++;
}
我正在初始化并检查如下值:

int main() {
    List *x = initialize(10);
    for (int i = 0; i < 100; i++) {
        add(x,i); 
    }
    for (int i =0; i < x->length; i++) {
        printf("val %d is %d\n",i,x->vals[i]);
    }
    free(x);
    return 0; 
}
intmain(){
列表*x=初始化(10);
对于(int i=0;i<100;i++){
加(x,i);
}
对于(int i=0;ilength;i++){
printf(“val%d是%d\n”,i,x->vals[i]);
}
免费(x);
返回0;
}
我相信错误在add方法中,我试图调整大小,但我不太明白如何处理这个错误

int* bigger_arr = realloc(x->vals, (2 * x->max_allowed));
将是

int* bigger_arr = realloc(x->vals, (2 * x->max_allowed*sizeof(int)));
但是您的
realloc
方式是错误的,因为
realloc
也可能失败。在分配它之前,应该检查它返回的内容

curr=malloc(5*sizeof(int))将被删除
curr=malloc(sizeof(List))因为对于结构,您无法通过添加单个成员元素的大小来计算它所需的分配内存。在这种情况下,总有可能出现填充失败的情况

将是

int* bigger_arr = realloc(x->vals, (2 * x->max_allowed*sizeof(int)));
但是您的
realloc
方式是错误的,因为
realloc
也可能失败。在分配它之前,应该检查它返回的内容

curr=malloc(5*sizeof(int))将被删除

curr=malloc(sizeof(List))因为对于结构,您无法通过添加单个成员元素的大小来计算它所需的分配内存。在这种情况下,总有可能出现填充失败的情况

malloc(5*sizeof(int))
来自哪里?我没有看到任何5个整数的数组。我也在上面,你猜指针的大小是
int
的两倍吗<代码>curr=malloc(sizeof(*curr))有太多的幻数。在
initialize
函数中使用两次的
10
与传递给该函数的
10
无关?假设您想要
20
-您找到/替换了哪些
10
s?malloc(5*sizeof(int))
来自哪里?我没有看到任何5个整数的数组。我也在上面,你猜指针的大小是
int
的两倍吗<代码>curr=malloc(sizeof(*curr))有太多的幻数。在
initialize
函数中使用两次的
10
与传递给该函数的
10
无关?假设您想要
20
-您找到/替换了哪些
10
s?