0

我正在研究 C/C++ 中的指针,作为我学习这个问题的小项目,我正在尝试开发一个简单的应用程序来使用矩阵进行操作。我想问一下我使用指针和动态分配的这种方式是正确的还是我弄错了。谢谢 :)

#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;
}
4

2 回答 2

0

我发现了一个问题:

while(x < numberCollumns)
{
   matrix[x] = (int*)malloc(numberCollumns*sizeof(int));
   x++;
}

你的循环条件是错误的。如果行数和列数不匹配怎么办?此外,我没有看到对free.

至于代码风格,你的 while 循环会比 for 循环更好看:

for(int x = 0; x < numberRows; ++x)
{
    matrix[x] = (int*)malloc(numberCollumns*sizeof(int));
}

边注

代码是纯 C 的(除了从 的返回的转换malloc)。C++ 代码看起来会大不相同。

于 2012-10-16T23:09:07.863 回答
0

看起来没问题,除了 Jesse Good 指出你的构造应该循环numberRows,而不是numberCollumnsPS 'column' 中只有一个 L)。

我认为您对变量名的选择有误导性。您的矩阵布局为matrix[rows][columns],但您使用 对其进行索引[x][y]。传统上,x是水平索引并且y是垂直的。使用x来选择行(这是一个垂直维度)有一天会让你感到困惑。要么颠倒这些用法,要么做数学家所做的事情(使用iand j)。

关于 2D 矩阵本身,出于缓存局部性和效率的原因,我会避免对每一行进行单独分配。前几天我回答了一个问题并对此提出了一些想法: 使用指针而不是数组

for最后,这只是一般风格的东西......当你只是迭代你的行/列时,为什么不使用循环。它更容易阅读,而且更不容易发生意外(“哎呀,我忘了重置和/或增加我的计数器”)。

哦,是的,如果这是纯 C,请不要转换malloc调用的结果。

于 2012-10-16T23:16:28.047 回答