我想读一个文件,其第一行给出了数组的尺寸。例如:
4 3
然后我希望我的程序分配rows = 4
和columns = 3
。假设它保持整数,为这个多维数组分配内存的正确方法是什么?
由于整数的大小为4 bytes
,我假设它是:
int** multiArray;
... code to read in first line of file and assign value to rows and columns
multiArray = malloc(sizeof(int) * rows * columns));
或者换句话说,为我的48 bytes
整数数组分配[4][3]
内存是否正确?
答案 0 :(得分:1)
一种方法可能是:
int * array = ( int * ) malloc ( rows * columns * sizeof ( int ) );
int ** multiarray = ( int ** ) malloc ( rows * sizeof ( int * ) );
for ( int i = 0; i < rows; i++ )
multiarray[i] = array + i * columns * sizeof ( int );
答案 1 :(得分:0)
有两个主要选择:
如果您希望有时扩展单个行,则必须使用第一个选项。第二个选项强制您使所有行具有相同的长度。
第二个选项的唯一问题是你不能使用双重引用语法,因为只有一个解除引用发生。您必须以不同的方式访问,例如:
// global
int *multiArray;
size_t multiArray_num_columns;
#define MARRAY(row, col) my_multiarray[(row) * multiArray_num_columns + (col)]
// in a function
multiArray_num_columns = columns;
multiArray = malloc(rows * columns * sizeof *multiArray);
MARRAY(3, 2) = 20;
还有第三种选择(我不喜欢但有些人会这样做):
这使您获得双重引用语法,但没有其他好处;它的缺点是它编码更多,并且可能会导致运行时间损失(两次解除引用可能需要多次取消引用)。
更新:这里是分别分配每一行的代码(这会被问到很多,但我找不到好的副本!)
// global
int **multiArray;
// in function
multiArray = malloc( rows * sizeof *multiArray );
for (size_t row = 0; row < rows; ++row)
multiArray[row] = malloc( columns * sizeof **multiArray );
您应该针对NULL
检查所有这些结果,如果失败则退出。
使用模式ptr = malloc( NUM * sizeof *ptr );
可以保证分配适当的内存量,即使您稍后更改ptr
的类型也是如此。