"free(): invalid next size (fast)" 尝试释放数组内存时出错
"free(): invalid next size (fast)" error when trying to free memory of array
我正在编写一种合并排序变体。在我的任务中,我使用了两个数组:arr
数组中的键和 brr
数组中的值。键是整数,值是字符串。合并函数接收这两个数组,l
、m
和 r
作为左、中和右索引。
void merge(int arr[], char** brr, int l, int m, int r)
我计算了我需要的两个新数组的大小:
int size1 = m-l+1;
int size2 = r-m;
为了合并数组,我使用 malloc
函数为键和字符串创建了两个新数组:
int* left = malloc(size1*sizeof(int));
int* right = malloc(size2*sizeof(int));
char** lefts = malloc(size1*sizeof(char*));
char** rights = malloc(size2*sizeof(char*));
然后我从输入数组中复制值:
for(int i = 0; i < size1; i++){
left[i] = arr[l+i];
lefts[i] = brr[l+i];
}
并对新数组进行排序。
i = j = 0;
k = l;
while(i < size1 && j < size2){
if(left[i] < right[j]){
brr[k] = lefts[i];
arr[k] = left[i];
i++;
}else{
brr[k] = rights[j];
arr[k] = right[j];
j++;
}
k++;
}
然后我将最后一个项目添加到 brr
数组中,在尝试释放 rights
数组的内存后我得到一个错误。
free(lefts);
lefts = NULL;
free(rights);
rights = NULL;
注意:尝试释放 lefts
数组的内存时没有错误,只有 rights
。我尝试交换 free(lefts)
和 free(rights)
,但结果是一样的。
完整功能代码:
void merge(int arr[], char** brr, int l, int m, int r){
int size1 = m-l+1;
int size2 = r-m;
int* left = malloc(size1*sizeof(int));
int* right = malloc(size2*sizeof(int));
char** lefts = malloc(size1*sizeof(char*));
char** rights = malloc(size2*sizeof(char*));
for(int i = 0; i < size1; i++){
left[i] = arr[l+i];
lefts[i] = brr[l+i];
}
for(int i = 0; i < size2; i++){
right[i] = arr[m+1+i];
rights[i] = brr[m+1+i];
}
int i, j, k;
i = j = 0;
k = l;
while(i < size1 && j < size2){
if(left[i] < right[j]){
brr[k] = lefts[i];
arr[k] = left[i];
i++;
}else{
brr[k] = rights[j];
arr[k] = right[j];
j++;
}
k++;
}
while(i < size1){
brr[k] = lefts[i];
arr[k] = left[i];
k++;
i++;
}
while(j < size2){
brr[k] = rights[j];
arr[k] = right[j];
k++;
j++;
}
free(left);
left = NULL;
free(right);
right = NULL;
free(lefts);
lefts = NULL;
free(rights);
rights = NULL;
}
MergeSort 函数:
void mergeSort(int arr[], char** brr, int l, int r){
if(l < r){
int m = l+(r-l)/2;
mergeSort(arr, brr, l, m);
mergeSort(arr, brr, m+1, r);
merge(arr, brr, l, m, r);
}
}
主要:
int main(){
const int maxStrings = 14;
const int maxStringSize = 70;
int n;
scanf("%d", &n);
getchar();
int *Keys = malloc(n*sizeof(int));
for(int i = 0; i < maxStrings; i++) Keys[i] = i;
char **Strings = malloc(n*sizeof(char*));
char *temp;
for(int i = 0; i < n; i++){
getStr(&temp, maxStringSize);
Strings[i] = temp;
}
mergeSort(Keys, Strings, 0, n-1);
}
getStr:
void getStr(char **a, int n){
*a = malloc(n*sizeof(char));
char c;
int i = 0;
while( (c = getchar()) != '\n' && i < n-1){
if(c == EOF){
(*a)[i] = '[=20=]';
return;
}
(*a)[i++] = c;
}
(*a)[i] = '[=20=]';
}
在您的主要任务中,for(int i = 0; i < maxStrings; i++)
应该达到 n
,而不是达到 maxStrings
否?
该错误通常表示覆盖了一些不属于您的内存。通常,您已经销毁了要释放的变量的 "mallocs book-keeping data"。
所以寻找非法内存写入。这个代码怎么样?
int *Keys = malloc(n*sizeof(int));
for(int i = 0; i < maxStrings; i++) Keys[i] = i;
你 malloc
只有 n
个元素,但你仍然写 maxStrings
个元素。所以如果 n
小于 maxStrings
你有一个写出侧分配的内存。
我正在编写一种合并排序变体。在我的任务中,我使用了两个数组:arr
数组中的键和 brr
数组中的值。键是整数,值是字符串。合并函数接收这两个数组,l
、m
和 r
作为左、中和右索引。
void merge(int arr[], char** brr, int l, int m, int r)
我计算了我需要的两个新数组的大小:
int size1 = m-l+1;
int size2 = r-m;
为了合并数组,我使用 malloc
函数为键和字符串创建了两个新数组:
int* left = malloc(size1*sizeof(int));
int* right = malloc(size2*sizeof(int));
char** lefts = malloc(size1*sizeof(char*));
char** rights = malloc(size2*sizeof(char*));
然后我从输入数组中复制值:
for(int i = 0; i < size1; i++){
left[i] = arr[l+i];
lefts[i] = brr[l+i];
}
并对新数组进行排序。
i = j = 0;
k = l;
while(i < size1 && j < size2){
if(left[i] < right[j]){
brr[k] = lefts[i];
arr[k] = left[i];
i++;
}else{
brr[k] = rights[j];
arr[k] = right[j];
j++;
}
k++;
}
然后我将最后一个项目添加到 brr
数组中,在尝试释放 rights
数组的内存后我得到一个错误。
free(lefts);
lefts = NULL;
free(rights);
rights = NULL;
注意:尝试释放 lefts
数组的内存时没有错误,只有 rights
。我尝试交换 free(lefts)
和 free(rights)
,但结果是一样的。
完整功能代码:
void merge(int arr[], char** brr, int l, int m, int r){
int size1 = m-l+1;
int size2 = r-m;
int* left = malloc(size1*sizeof(int));
int* right = malloc(size2*sizeof(int));
char** lefts = malloc(size1*sizeof(char*));
char** rights = malloc(size2*sizeof(char*));
for(int i = 0; i < size1; i++){
left[i] = arr[l+i];
lefts[i] = brr[l+i];
}
for(int i = 0; i < size2; i++){
right[i] = arr[m+1+i];
rights[i] = brr[m+1+i];
}
int i, j, k;
i = j = 0;
k = l;
while(i < size1 && j < size2){
if(left[i] < right[j]){
brr[k] = lefts[i];
arr[k] = left[i];
i++;
}else{
brr[k] = rights[j];
arr[k] = right[j];
j++;
}
k++;
}
while(i < size1){
brr[k] = lefts[i];
arr[k] = left[i];
k++;
i++;
}
while(j < size2){
brr[k] = rights[j];
arr[k] = right[j];
k++;
j++;
}
free(left);
left = NULL;
free(right);
right = NULL;
free(lefts);
lefts = NULL;
free(rights);
rights = NULL;
}
MergeSort 函数:
void mergeSort(int arr[], char** brr, int l, int r){
if(l < r){
int m = l+(r-l)/2;
mergeSort(arr, brr, l, m);
mergeSort(arr, brr, m+1, r);
merge(arr, brr, l, m, r);
}
}
主要:
int main(){
const int maxStrings = 14;
const int maxStringSize = 70;
int n;
scanf("%d", &n);
getchar();
int *Keys = malloc(n*sizeof(int));
for(int i = 0; i < maxStrings; i++) Keys[i] = i;
char **Strings = malloc(n*sizeof(char*));
char *temp;
for(int i = 0; i < n; i++){
getStr(&temp, maxStringSize);
Strings[i] = temp;
}
mergeSort(Keys, Strings, 0, n-1);
}
getStr:
void getStr(char **a, int n){
*a = malloc(n*sizeof(char));
char c;
int i = 0;
while( (c = getchar()) != '\n' && i < n-1){
if(c == EOF){
(*a)[i] = '[=20=]';
return;
}
(*a)[i++] = c;
}
(*a)[i] = '[=20=]';
}
在您的主要任务中,for(int i = 0; i < maxStrings; i++)
应该达到 n
,而不是达到 maxStrings
否?
该错误通常表示覆盖了一些不属于您的内存。通常,您已经销毁了要释放的变量的 "mallocs book-keeping data"。
所以寻找非法内存写入。这个代码怎么样?
int *Keys = malloc(n*sizeof(int));
for(int i = 0; i < maxStrings; i++) Keys[i] = i;
你 malloc
只有 n
个元素,但你仍然写 maxStrings
个元素。所以如果 n
小于 maxStrings
你有一个写出侧分配的内存。