【发布时间】:2021-08-04 12:51:14
【问题描述】:
我是 C 新手,我试图编写一个动态 int 数组,让用户通过终端输入数字,直到用户输入 -1。因此,用户可以键入任意数量的 int,并且每次输入另一个有效的 int 时都会重新分配数据。
有时它会按预期工作,其他时候我得到:free(): double free detected in tcache 2 中止(核心转储)错误。 我在每次输入后打印值,在输入 -1 之前一切似乎都很好。而且这个bug每隔一段时间才会出现一次。
这是我的代码:
void output(int *ptr, int len){
printf("\n");
for(int i=0; i<len; i++){
printf("%d %p \n", ptr[i], ptr+i);
}
printf("\n");
}
int input(int *ptr, int *size){
int x;
printf("Insert your numbers:\n");
while(1){
scanf("%d", &x);
if(x == -1) break;
size[0]++;
// printf("Size: %d\n", size[0]);
ptr = realloc(ptr, size[0] * sizeof(int));
if(ptr == NULL) return -1;
int indexToStore = size[0]-1;
// printf("Index: %d\n", indexToStore);
ptr[indexToStore] = x;
output(ptr, size[0]);
}
return 0;
}
int main()
{
int size = 0;
int *array = (int*)malloc(sizeof(int));
if(array == NULL) return -1;
input(array, &size);
output(array, size);
input(array, &size);
output(array, size);
free(array); array = NULL;
return 0;
}
【问题讨论】:
-
关于第一次调用
input()时的语句int indexToStore = size[0]-1;,size中的值是0,所以size[0]-1变为0xFFFFFFFF (-1),所以indexToStore变为-1。结果是语句中未定义的行为:ptr[indexToStore] = x;此外,函数:output()每次调用input()时都会被调用两次,这可能不是您想要的 -
每次调用函数:
input(),都会产生另一个内存泄漏。这是因为main()中的指针array[]永远不会更新,