【问题标题】:Dynamic Matrix problem. How could I fix this?动态矩阵问题。我该如何解决这个问题?
【发布时间】:2019-08-22 01:11:33
【问题描述】:

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

我尝试移动括号,使用不同的值,但它总是在 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

【问题讨论】:

标签: c


【解决方案1】:

变化:

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];,这使它成为一个指向四列数组的指针(具体来说,它指向第一个这样的数组,然后是其他数组)。

【讨论】:

  • 完美!非常感谢您的解释!作业希望我们只使用指针而不是 [] 来循环矩阵,所以我真的很困惑,但这帮助了很多!
  • 您如何建议我将其发送到函数?我应该将它作为 int*Mat[] 发送吗?
  • @W.Blengio:声明函数参数的方式与指针相同:int (*Mat)[columns]。确保 columns 是较早的参数。
  • @W.Blengio 您可以将函数声明为void func (int rows, int cols, int mat[rows][cols])。这是因为int mat[rows][cols] 作为函数参数等效于int(*mat)[cols]。然后用func(rows, cols, Mat)调用函数,其中Matint (*Mat)[columns];类型的指针。
【解决方案2】:

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

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

【讨论】:

  • 这比 OP 更糟糕,因为它不创建 2D 数组,而是创建一个缓慢的分段查找表。正确的解决方案是将int**更改为正确的指针类型。
猜你喜欢
  • 2020-03-25
  • 2020-02-14
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
相关资源
最近更新 更多