我的指针和动态分配的实现是否正确?

时间:2012-10-16 22:59:24

标签: c pointers matrix

我正在研究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;
}

2 个答案:

答案 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选择行(这是一个垂直维度)会让您有一天感到困惑。要么反过来使用这些,要么做数学家做的事情(使用ij)。

关于2D矩阵本身,出于缓存局部性和效率的原因,我会避免每行的单独分配。我前几天回答了一个问题并对此提出了一些想法:Using pointers instead of an array

最后,这只是一般风格的事情......当您只是遍历行/列时,为什么不使用for循环。它更容易阅读,更不容易发生事故(“我忘了重置和/或增加我的计数器”)。

哦,是的,如果这是纯C,请不要投出malloc来电的结果。