更改矩阵大小后访问未分配的内存

时间:2015-05-03 22:24:22

标签: c math memory matrix jagged-arrays

我不知道任务的干细节和我试图解决的问题,我不会打扰你。我会切入正确的行列。

我需要用数据填充矩阵。矩阵是正方形,除了前2个对角线(0到n-1之间的M[i][i]i,0到n-2之间的M[i][i+1]i之外,一切都为零已经填满了)

我们想用这个复杂的公式来填充矩阵。

M[i][j]=max(a+min(M[i+2][j],M[i+1][j-1]) , b+min(M[i+1][j-1],M[i][j-2]))

结果是上三角矩阵。从上面的公式可以看出,为了计算第k个对角线,我们需要k-2对角线。我说前两个是给出的。

我写了一个代码来填充矩阵,它正在按预期工作。

这是我的问题:

由于它是一个上三角矩阵,下半部分全部为零。所以浪费记忆并保存它没有意义。所以我想自己而不是分配一个n乘n矩阵,我会分配n行,并且第一行ill分配n个空格,第二个n-1,第三个n-2等等...... / p>

但是由于我们改变了矩阵的维数,我上面写的计算M[i][j]的公式现在不同了。在我看来,我们会将i'th行,i列中的所有值移到左侧。在第0行没有任何改变。在第1行中,我们将所有值1列向左拉,等等。如果我理解正确:

M[i][j]=M'[i][j-i]

M'是我们的新矩阵。所以在上面的公式中插入:

M'[i][j]=max(a+min(M'[i+2][j-i],M'[i+1][j-1-i]) , b+min(M'[i+1][j-1-i],M'[i][j-2-i]))

但是现在填充矩阵的程序无法正常工作。它用垃圾填充矩阵。

以下是填充矩阵的代码:

void fill_matrix() //fills the matrix with data of optimal path, we use memoization rather than recursion, so this step is necessary. 
{ //first step is to allocate the matrix. we can assume right_index==size-1 since this is the first thing we do after generating the array
    int i,j;
    optimum_matrix=(int**)malloc((right_index+1)*sizeof(int**));
    for(j=0;j<=right_index;j++)
        optimum_matrix[j]=(int*)malloc((right_index+1-j)*sizeof(int*)); //matrix allocated. upper triangular matrix. no need to allocate n^2 spaces. //to fix indices, M[i][j]=M'[i][j-i+1]. subtract i and add 1 to each column, since we moved each entry in row i, i-1 columns back.
    for(i=0;i<=right_index;i++) //first diagonal
        optimum_matrix[i][0]=data_array[i];
    for(i=0;i<right_index;i++) //second diagonal
        optimum_matrix[i][1]=get_max(data_array[i],data_array[i+1]);
    for(i=0;i<=right_index;i++)
    {
        for(j=2;j<=right_index-i;j++)
            optimum_matrix[i][j]=get_max(data_array[i]+get_min(optimum_matrix[i+2][j-i],optimum_matrix[i+1][j-i-1]),data_array[j]+get_min(optimum_matrix[i+1][j-i-1],optimum_matrix[i][j-i-2])); //here is the problem
    }
}

这是打印矩阵的代码

void print_matrix()
{
    int i,j,k;
    for(i=0;i<=right_index;i++)
    {
        for(k=0;k<i;k++)
            printf("0 ");
        for(j=0;j<=right_index-i;j++)
            printf("%d ",optimum_matrix[i][j]);
        printf("\n");
    }
}

即使在填充第三对角线的第一次迭代中,当它进入for循环时它会说&#34;这是问题&#34;,如果我输入printf("%d",optimum_matrix[i+2][j-i]);它将打印垃圾。而且我不明白为什么因为公式一致。

非常感谢帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

optimum_matrix=(int**)malloc((right_index+1)*sizeof(int**));

这不是分配双数组的正确方法。它只分配双数组的一个维度。我很难按照你的逻辑来确定每行和每列的大小。因此,下面可能不是您想要的确切尺寸。但希望它确实说明了如何更正确地分配双数组。

int **optimum_matrix = malloc((right_index+1)*sizeof(int*));

for (i = 0; i < (right_index+1); i++) {
    optium_matrix[i] = malloc((right_index+1)*sizeof(int));
}
顺便说一下,为了简洁起见,我省略了malloc返回值的检查。而且您的原始代码也没有检查malloc的返回值。应始终这样做。