c - 检测到 glibc - 在 C 程序中释放(int ** 类型)时出现双重释放或损坏消息

标签 c dynamic-memory-allocation

int main (void)
{   
    int i,j;
int n;
int **P;
int *d;

scanf("%d",&n);

d=(int*)malloc(sizeof(int)*(n+1));

P=(int**)malloc(sizeof(int*)*(n+1));

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

for(i=0;i<n+1;i++)
    scanf("%d",&d[i]);
minimult(n,d,P);
order(1,n,P);

free(d);
for(i=0;i<n+1;i++)
    free(P[i]);
free(P); //<----------------when execute here!!!!
return 0;
}
int minimum (int **M,int *d,int i, int j)
{
int count;
int temp,temp2;
for(count=i;count<=j-1;count++)
{
    temp=M[i][count]+M[count+1][j]+d[i-1]*d[count]*d[j];
    if(M[i][j]>temp||count==i)
    {
    M[i][j]=temp;
    temp2=count;
    }
}
return temp2;


}

int minimult(int n, int * d, int **P)
{
int i,j,k,diagonal;
int **M=(int**)malloc(sizeof(int*)*(n+1));
int result;
for(i=0;i<n+1;i++)
    M[i]=(int*)malloc(sizeof(int)*(n+1));
for(i=1;i<=n;i++)
    M[i][i]=0;
for(diagonal=1;diagonal<=n-1;diagonal++)
    for(i=1;i<=n-diagonal;i++)
    {
        j=i+diagonal;
        P[i][j]=minimum(M,d,i,j);
    }
result=M[1][n];
for(i=0;i<n+1;i++)
    free(M[i]);
free(M); 
return result;
}

该算法正在求解优化的矩阵乘法顺序。 输入为 4 2 3 4 5。 当我删除该行时,它运行成功。

有什么问题?

最佳答案

P[i] 的分配循环中,你循环一对多时间并覆盖超过为 P 分配的内存的末尾.将循环条件更改为 i < n + 1 (或 i <= n )。

关于c - 检测到 glibc - 在 C 程序中释放(int ** 类型)时出现双重释放或损坏消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16294847/

相关文章:

c - 找到c中某物的最大索引

c - 'c' 问题中的动态内存分配

c - 在 C 程序中使用 0 而不是 '\0'

c - 函数指针的奇怪 typedef

c++ - int num = *(int *)number;这是做什么的?

c - 在 C 中动态创建和初始化指向结构的指针数组

c - GLib 原子和内存块

c++ - 涉及指针和手动实现的矩阵类的问题

c++ - 跟踪动态内存

arrays - ALLOCATABLE 数组还是 POINTER 数组?