很可能我在某处错误地分配了内存

most likely I am allocating memory incorrectly somewhere

请帮帮我。我有一个功能。它应该删除索引号下的行。我正在创建一个新的二维数组。我为它分配内存。我从源数组中清除内存并重新分配给它。

int **matrix;

这是我的矩阵

int** delete_with_index(int n,int m, int **arr, int index){
    int i, g;
    int **new_arr;
    new_arr= malloc(n*sizeof(int *));
    for (i=0;i<n;i++){
        new_arr[i]=malloc(m*sizeof(int));
    }
    for (i=0;i<n;i++){
        for (g=0;g<m;g++){
            new_arr[i][g]=arr[i][g];
        }
        free(arr[i]);
    }
    free(arr);
    arr= malloc((n-1)*sizeof(int *));
    for (i=0;i<(n-1);i++){
        arr[i]=malloc(m*sizeof(int));
    }
    for (i=0;i<index;i++){
        for (g=0;g<m;g++){
            arr[i][g]=new_arr[i][g];
        }
        free(new_arr[i]);
    }
    for (i=index+1;i<n;i++){
        for (g=0;g<m;g++){
            arr[i][g]=new_arr[i-1][g];
        }
        free(new_arr[i-1]);
    }
    free(new_arr);
    return arr;
}

这是我的功能

res_m = delete_with_index(n1, m1, res_m, index);

我就是这么叫它的

  1. 它不是二维数组,只是指针数组。您不必复制所有元素,只需复制指针。您不必为每一行传递已分配内存的大小,因为不需要它。
  2. 使用正确的尺码类型
  3. 您不需要新数组,但如果 createnew 参数为 true.
  4. ,此函数将分配 return 一个
int **deleteROW(const size_t rows, int **arr, size_t index, int createnew, int freeDeleted)
{
    int **newArray = NULL;

    if(arr && rows)
    {
        if(createnew)
        {
            newArray = malloc(sizeof(*newArray) * (rows - 1));
        }
        else
        {
            newArray = arr;
        }
        if(newArray)
        {
             if(freeDeleted) free(arr[index];
             memmove(newArray, arr, index * sizeof(*newArray));
             memmove(newArray + index, arr + index + 1, (rows - index - 1) * sizeof(newArray));
        }  
    }
    return newArray;
}

如果您只想从指针数组中删除一行:

int **deleteROW(const size_t rows, int **arr, size_t index, int freeDeleted)
{
    int **newArray = NULL;

    if(arr && rows)
    {
        if(freeDeleted) free(arr[index])
        memmove(&arr[index], &arr[index + 1], (rows - index - 1) * sizeof(*newArray));
    }
    return arr;
}

如果你想从一个真正的二维数组中删除一行,你只需要:

void *deleteROW(const size_t rows, size_t cols, int (*arr)[cols], size_t index)
{
    if(arr && rows && cols && index < rows - 1)
    {
        memmove(arr[index], arr[index + 1], (rows - index - 1) * sizeof(*arr));
    }
    return arr;
}