【问题标题】:Why do I get an error of "free(): invalid pointer"?为什么我会收到“free(): invalid pointer”的错误?
【发布时间】:2019-11-22 03:04:13
【问题描述】:

我是 C 的新手,我正在使用带有 -ansi 的 gcc 编译器。

我正在尝试在 C 中实现 Strassen 的方阵乘法算法。作为热身,我只是先实现一个递归算法,它将每个矩阵分解为 4 个子矩阵(我的想法是稍后我将实现 Strassen 的算法) .

程序如下:

#include <stdio.h>
#include <stdlib.h>
int** read_square_matrix(int size); /*returns dynamically allocated size x size matrix*/
int** square_matrix_multiply_helper(int** A,int** B, int row1, int col1, int row2, int col2, int size); /*recursively compute product. Assumes size is power of two*/
int** square_matrix_multiply(int** A,int** B, int size);/*expands dimension to a power of two if necessary and computes product*/
int main()
{
    int** A;
    int** B;
    int** C;
    int i,size;

    printf("Enter size: ");
    scanf("%d",&size);

    printf("Enter array A: ");
    A = read_square_matrix(size);

    printf("Enter array B: ");
    B = read_square_matrix(size);

    C = square_matrix_multiply(A,B,size);
    printf("Their product is:\n");
    print_square_matrix(C,size);
    for (i=0;i<size;++i)
    {
        free(A[i]);
        free(B[i]);
        free(C[i]);
    }
    free(A);
    free(B);
    free(C);

    return 0;
}

代码适用于 size=1,2,4。当我尝试两个 3x3 矩阵时,比如全部为 1,就是失败的地方。特别是 free(A[i]) 在第一次迭代时失败并出现错误

free(): invalid pointer

现在环顾四周,似乎这意味着 A[i] 不是由 malloc 分配的。我不明白这怎么可能。下面是矩阵乘法的代码:

int** square_matrix_multiply(int** A, int** B, int size)
{
    int** C;
    int power,i,j;
    power = 1;
    while (power<size)
        power*=2;
    if (size<power)
    {
        A = realloc(A,power*sizeof(int*));
        B = realloc(B,power*sizeof(int*));
        for (i=0;i<size;++i)
        {
            A[i] = realloc(A[i],power*sizeof(int));
            B[i] = realloc(B[i],power*sizeof(int));
            for (j=size;j<power;++j)
            {
                A[i][j] = 0;
                B[i][j] = 0;
            }
        }
        for (i=size;i<power;++i)
        {
            A[i] = malloc(power*sizeof(int));
            B[i] = malloc(power*sizeof(int));
            for (j=0;j<power;++j)
            {
                A[i][j] = 0;
                B[i][j] = 0;
            }
        }
    }
    C = square_matrix_multiply_helper(A,B,0,0,0,0,power);
    for (i=size;i<power;++i)
    {
        free(A[i]);
        free(B[i]);
        free(C[i]);
    }
    A = realloc(A,size*sizeof(int*));
    B = realloc(B,size*sizeof(int*));
    C = realloc(C,size*sizeof(int*));
    for (i=0;i<size;++i)
    {
        A[i] = realloc(A[i],size*sizeof(int));
        B[i] = realloc(B[i],size*sizeof(int));
        C[i] = realloc(C[i],size*sizeof(int));
    }
    return C;
}

我已经看了好几个小时了,但我不知道出了什么问题。有人能帮助我吗?谢谢! 编辑:read_square_matrix 的实现:

int** read_square_matrix(int size)
{
    int** C;
    int i,j;
    C = malloc(size*sizeof(int*));
    for (i=0;i<size;++i)
    {
        C[i] = malloc(size*sizeof(int));
        for (j=0;j<size;++j)
            scanf("%d",&C[i][j]);
    }
    return C;
}

【问题讨论】:

  • realloc 调用 AB 的任何地址都不会在 square_matrix_multiply 函数退出时保留。该函数中的A 是该函数的本地。当函数返回时,函数内部对A 的任何分配都将丢失。即调用者看不到realloc的内存。
  • 你能展示一下read_square_matrix的实现吗?你是用malloc建矩阵吗?
  • @Sameer 是的。我现在添加它。
  • @kaylum 肯定没有问题。我暂时扩展 A,B 以添加零行和列,然后将它们恢复为原始大小。原来的 A,B 仍然分配有 malloc,所以我不明白为什么它们不能被释放。
  • man relloc: if the area pointed to was moved, a free(ptr) is done。也就是说,原来的内存被realloc释放了,所以你在做双重释放。

标签: c pointers malloc free realloc


【解决方案1】:

square_matrix_multiply函数中,应该传递int** A&int** B的地址。将其改为int** square_matrix_multiply(int*** A, int*** B, int size)C = square_matrix_multiply(A,B,size)应为C = square_matrix_multiply(&amp;A,&amp;B,size),并更改square_matrix_multiply的实现。

【讨论】:

  • 这可能有助于澄清问题是square_matrix_multiply 通过将AB 的原始值传递给realloc 使它们无效,但它不会返回新值给来电者。
  • square_matrix_multiply中,使用*A = realloc(*A,power*sizeof(int*)); *B = realloc(*B,power*sizeof(int*));
猜你喜欢
  • 2020-07-23
  • 2020-09-24
  • 2015-05-24
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 2014-07-04
  • 2011-07-01
  • 2017-03-31
相关资源
最近更新 更多