【问题标题】:most likely I am allocating memory incorrectly somewhere很可能我在某处错误地分配了内存
【发布时间】:2022-01-26 01:42:38
【问题描述】:

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

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

我是这样称呼它的

【问题讨论】:

  • 欢迎来到 Stack Overflow。您没有提出问题,也没有描述具体的错误/问题。请提供完整的minimal reproducible example 以及准确的输入、预期结果和实际结果。请收下tour 并阅读How to Ask
  • 当我调用它时,我的程序迷恋进程已完成,退出代码为 -1073741510(0xC000013A:被 Ctrl+C 中断)
  • Edit 用所有请求的信息更新它的问题。不在 cmets 中。
  • 我正在创建与原始矩阵完全相同的矩阵。然后我清理了原来的那个。我给它分配了这么一个数量,使它变成不是nm,而是(n-1)m,因为我需要删除一行
  • 再次,请提供完整的minimal reproducible example。我们需要能够重现问题的准确代码。

标签: c function memory


【解决方案1】:
  1. 它不是二维数组,只有指针数组。您不必复制所有元素,只需复制指针。您不必为每一行传递分配的内存大小,因为它不是必需的。
  2. 使用正确的尺寸类型
  3. 您不需要新数组,但如果createnew 参数为true,此函数将分配并返回一个。
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;
}

【讨论】:

    猜你喜欢
    • 2012-10-30
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    相关资源
    最近更新 更多