我正在研究C / C ++中的指针,作为我学习这个问题的小项目,我正在尝试开发一个使用matrixies进行操作的简单应用程序。我想问这种方式我是否使用指针和动态分配是正确的还是我做错了。谢谢:))
#include <stdlib.h>
#include <stdio.h>
int numberRows;
int numberCollumns;
void getSize()
{
printf("Write down size of matrix in format Rows Collumns: ");
scanf("%i %i", &numberRows, &numberCollumns);
}
void getMatrix(int *m[])
{
int x = 0;
int y = 0;
while(x<numberRows)
{
while(y<numberCollumns)
{
scanf("%i", &m[x][y]);
y++;
}
x++;
y = 0;
}
}
void writeMatrix(int *m[])
{
int x = 0;
int y = 0;
while(x<numberRows)
{
while(y<numberCollumns)
{
printf("%i ", m[x][y]);
y++;
}
printf("\n");
x++;
y = 0;
}
}
int main()
{
getSize();
int **matrix;
matrix = (int**)malloc(numberRows*sizeof(int*));
int x = 0;
while(x < numberCollumns)
{
matrix[x] = (int*)malloc(numberCollumns*sizeof(int));
x++;
}
getMatrix(matrix);
printf("\n\nMatrix: \n");
writeMatrix(matrix);
return 0;
}
答案 0 :(得分:0)
我发现了一个问题:
while(x < numberCollumns)
{
matrix[x] = (int*)malloc(numberCollumns*sizeof(int));
x++;
}
您的循环条件错误。如果行数和列数不匹配怎么办?
另外,我没有看到对free
的任何相应电话。
至于代码风格,你的while循环看起来好像循环:
for(int x = 0; x < numberRows; ++x)
{
matrix[x] = (int*)malloc(numberCollumns*sizeof(int));
}
旁注
代码是纯C(除了从malloc
转换回来之外)。 C ++代码看起来会有很多不同。
答案 1 :(得分:0)
看起来没问题,除非Jesse Good指出你的构造应该遍历numberRows
,而不是numberCollumns
( PS 只有一个L''列')。
我认为你有一个误导性的变量名称选择。您的矩阵布局为matrix[rows][columns]
,但您使用[x][y]
对其进行索引。传统上,x
是水平索引,y
是垂直索引。使用x
选择行(这是一个垂直维度)会让您有一天感到困惑。要么反过来使用这些,要么做数学家做的事情(使用i
和j
)。
关于2D矩阵本身,出于缓存局部性和效率的原因,我会避免每行的单独分配。我前几天回答了一个问题并对此提出了一些想法:Using pointers instead of an array
最后,这只是一般风格的事情......当您只是遍历行/列时,为什么不使用for
循环。它更容易阅读,更不容易发生事故(“我忘了重置和/或增加我的计数器”)。
哦,是的,如果这是纯C,请不要投出malloc
来电的结果。