C为被释放的对象列出不正确的校验和
我正在尝试为调整大小的数组编写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
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?