我编写了这段代码来存储可以执行不同操作的动态字符串数组。当我最初输入字符串和添加 2 个字符串时,它可以正常工作,但在第三个字符串上,它每次都会失败,并出现错误“free():在 tcache 2 中检测到双重释放”。我没有在程序中的任何地方释放内存,所以我不明白为什么会发生这个错误。另外,从我搜索此错误后看到的情况来看,当程序尝试释放之前已释放的内存位置时,就会发生这种情况。
该错误是由于 addend() 函数中的 realloc 语句而发生的。但我无法理解到底出了什么问题。
有人可以提示我在这里可能做错了什么吗?谢谢!
#include <stdio.h>
#include <stdlib.h>
void addend(char** arr,int size) {
arr = (char **) realloc(arr, (size+1)*sizeof(char *));
*(arr+size) = (char *) calloc(100, sizeof(char));
printf("Enter new string to be added : ");
scanf("%s",*(arr+size));
}
void addbegin(char** arr,int size) {
arr = (char **) realloc(arr, (size+1)*sizeof(char *));
for (int i = size; i>0; i--) {
*(arr+i) = *(arr+i-1);
}
printf("Enter new string to be added : ");
scanf("%s",*(arr));
}
void printarr(char** arr, int size) {
printf("[");
for (int i = 0; i<size; i++) {
printf("%s, ",*(arr+i));
}
printf("]\n");
}
void delete() {}
int main() {
int n;
printf("Enter the size of the array : ");
scanf("%d",&n);
char** arr = (char **) calloc(n,sizeof(char*));
for(int i=0; i<n; i++) {
*(arr+i) = (char *) calloc(100, sizeof(char));
}
for (int i = 0; i<n; i++) {
printf("Enter the (%d) string to be entered : ",i);
scanf("%s",*(arr+i));
}
int option;
for (;;) {
printf("Choose out of the following options: Add End (1), Add Beginning (2), Delete (3), Length (4), Print Array (5) : ");
scanf("%d",&option);
switch(option) {
case 1:
addend(arr,n);
n++;
break;
case 2:
addbegin(arr,n);
n++;
break;
case 3:
delete();
break;
case 4:
printf("%d",n);
break;
case 5:
printarr(arr,n);
break;
default:
printf("Invalid option, enter again\n");
}
}
}
void addend(char** array,int size) {
array = (char **) realloc(array, (size+1)*sizeof(char *));
/* ... */
它不会更改
arr
函数中的 main
,因为 array
(我故意更改名称以明确区分这两个变量)是 addend
函数作用域中的局部变量。
您需要将引用传递给
arr
才能修改它。
void addend(char*** array,int size) {
*array = realloc(*array, (size+1)*sizeof(**array));
/* ... */
并且在
main
函数中 addend(&arr,n);
。
您需要修改犯了同样错误的所有其他函数(以及对它们的调用)。
旁注:
realloc
。您需要将结果保存到临时变量,因为realloc
可能会失败并且会出现内存泄漏(因为您将无法引用先前分配的内存)malloc
和朋友的结果。如果它不能编译,则意味着您正在使用 C++ 编译器编译 C 代码,并且它不正确。