动态矩阵问题。我该如何解决?

时间:2019-08-22 01:11:33

标签: c

我试图用函数创建一个动态矩阵,但首先我决定对分配进行分段,以便我知道一切正常。但是创作没有用。

我尝试使用不同的值移动括号,但是当i = 2时,它总是崩溃

int rows=4;
    int columns=4;
    int cont=1;
    int ** Mat;
    Mat=(int**)malloc(rows*columns*sizeof(int));
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < columns; j++)
        {
            printf("%d",i);
            *(*(Mat+i)+j)=cont++;
        }
    }
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < columns; j++)
        {
            printf("%2d ", *(*(Mat+i)+j) );  /* a[i][j] */
        }
        printf("\n");
    }

我没有任何编译错误,我希望这 1234 5678 9101112 13141516

2 个答案:

答案 0 :(得分:0)

更改:

int ** Mat;
Mat=(int**)malloc(rows*columns*sizeof(int));

收件人:

int (*Mat)[columns];
Mat = malloc(rows * sizeof *Mat);

int ** Mat;声明Mat为指向int的指针。但是要使该工作有效,您必须为一堆指针分配空间(每行一个),并用指向为行分配的空间的指针填充它们。你没有那样做。

您为rows * columns int分配了空间,并将Mat设置为指向该空间。似乎您想将Mat用作指向矩阵(或正确地指向矩阵的第一行)的指针,而不是用作指向指针的指针。因此,将其声明为int (*Mat)[columns];,这使其成为四列数组的指针(具体来说,它指向第一个此类数组,然后是其他数组)。

答案 1 :(得分:0)

您的实现使用锯齿数组。也就是说,Mat是一个指针数组,其中每个指针都指向一行。代码中唯一出错的部分是初始化。当您为Mat创建指针时,行的指针来自malloc给您的任何内存,因此是否有效。您需要为每行初始化指针。

Mat=(int**)malloc(rows*sizeof(int*));
for (int i=0;i<rows;++i) {
    Mat[i] = malloc(cols*sizeof(int));
}