[英]What is the best way to declare and initialize a 2D array dynamically allocated?
我尝试过这种方式,但我不知道这是否是最好的方法:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ROW 5
#define COL 5
int *matrix;
int main(int argc, const char * argv[])
{
matrix = malloc(ROW * COL * sizeof(int));
memset(matrix, 0, ROW * COL * sizeof(int));
return 0;
}
(我忽略了您问题标题中的“最佳”一词)
尽量避免全局变量。 如果您需要main()
中的matrix
,则在main()
() 中声明它并根据需要将其传递给其他函数。
正如@Vlad 的回答所提到的——如果你特别想将你的数组设置为零,你可以将你的malloc()
和memset()
调用组合成一个calloc()
(“clear-allocate”,如果你愿意的话)调用。
如果您事先知道矩阵尺寸,您可能只需在堆栈上分配矩阵,例如:
int main(int argc, const char * argv[]) { int matrix[ROW * COL] = { 0 }; // etc. etc. }
(这也应该将整个数组设置为零。)
另一方面,如果矩阵非常大,那么即使对于先验已知的维度,动态分配也更有意义,因为堆栈空间是有限的。
使用malloc()
分别分配每一列或每一行并不是一个好主意。 即使您希望您的矩阵以matrix[i][j]
形式使用,您仍然会使用单个分配 - 但为实际数据分配空间以及指向列开头的指针序列。
进一步阅读:
当矩阵表示为二维数组时,最好处理它。
除了手动调用malloc
和memset
之外,您还可以将它们替换为calloc
的调用。
所以你可以在main中写(不需要在文件范围内声明指针)
int ( *matrix )[COL] = calloc( 1, sizeof( int[ROW][COL] ) );
使用这样的数组可以使代码更加清晰。 例如到 output 矩阵你可以写
for ( size_t i = 0; i < ROW; i++ )
{
for ( size_t j = 0; j < COL; j++ )
{
printf( "%d ", matrix[i][j] );
}
putchar( '\n' );
}
总结一下使用一维数组的困难,想象一下两个矩阵相乘的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.