尝试释放数组内存时出现“ free():下一个大小无效(快速)”错误

时间:2019-05-14 18:42:53

标签: c malloc free

我正在写一种合并排序变体。在我的任务中,我使用两个数组:arr数组中的键和brr数组中的值。键是整数,值是字符串。合并功能接收这两个数组lmr作为左,中和右索引。

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; } ,但结果是相同的。

全功能代码:

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);
    }
}

MergeSort函数:

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);
}

主要:

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] = '\0';
            return;
        }
        (*a)[i++] = c;
    }
    (*a)[i] = '\0';
}

getStr:

import numpy as np
import matplotlib.pyplot as plt

data = [1, 2, 4, 5, 9]
bindata = [0,1,1,0,1,1,0,0,0,1]
xaxis = np.arange(0, data[-1] + 1)
yaxis = np.array(bindata)
plt.step(xaxis, yaxis)

plt.xlabel('Filter Degree Combinations')
plt.ylabel('Negative Or Positive')
plt.title("Car 1")

#plt.savefig('foo.png') #For saving
plt.show()

2 个答案:

答案 0 :(得分:4)

该错误通常是覆盖某些不属于您的内存的信号。通常,您已经为要释放的变量破坏了“ mallocs簿记数据”。

所以寻找非法的内存写入。这段代码怎么样?

int *Keys = malloc(n*sizeof(int));
for(int i = 0; i < maxStrings; i++) Keys[i] = i;

您只能malloc个元素n,但是您仍然可以编写maxStrings个元素。因此,如果n小于maxStrings,则有一个写出侧分配的内存。

答案 1 :(得分:2)

在您的主机中,这是for(int i = 0; i < maxStrings; i++)最多为n,而不是最多maxStrings是吗?