我试图用函数创建一个动态矩阵,但首先我决定对分配进行分段,以便我知道一切正常。但是创作没有用。
我尝试使用不同的值移动括号,但是当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
答案 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));
}