2012-10-16 53 views
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; 
} 
+3

这是C风格的代码,而不是C++。 C/C++不是一种语言,请选择其中一种。 – GManNickG

+0

你测试了这个代码吗?它是否按照您的预期行事? – Beta

+1

可能对codereview网站更好。 – Joe

回答

0

我发现一个问题:

​​3210

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

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

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

旁注

的代码是纯C(以及除了从malloc回归的铸造)。 C++代码看起来很不一样。

0

它看起来不错,但杰西好指出,你的建设要遍历numberRows,不numberCollumnsPS只有一个L的“列”)。

我认为你有一个令人误解的变量名称选择。您的矩阵布局为matrix[rows][columns],但您使用[x][y]对其进行索引。传统上,x是一个水平索引,而y是垂直的。使用x选择行(这是一个垂直维度)有一天会让你困惑。要么反过来使用这些,要么做数学家的工作(使用ij)。

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

最后,这只是一个普通的风格的东西......当你迭代你的行/列时,为什么不使用for循环。阅读起来要容易得多,而且不太容易发生事故(“哎呦,我忘了重置和/或增加我的计数器”)。

噢,是的,如果这是纯粹的C,不要投你的malloc调用的结果。