我想读入一个文件,它的第一行给出了数组的尺寸。例如:
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));
或者换句话说,为我的[4][3]
整数数组分配48 bytes
的内存是否正确?
一种方法是:
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 );
有两个主要选项:
- 单独分配每一行
- 分配包含所有行的单个块
如果你有时想扩展单独的行,那么你必须使用第一个选项。第二个选项强制所有行长度相同。
第二个选项的唯一问题是,您不能使用双解引用语法,因为只发生一次解引用。您必须以不同的方式访问,例如:
// 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;
还有第三种选择(我不喜欢,但有些人喜欢):
- 分配单个块,并在其开头放置一个指针表
这使您获得双解引用语法,但没有其他好处;它的缺点是需要编写更多的代码,并且可能会导致运行时损失(两次取消引用的代价可能大于一次取消引用的代价)。
Update:这是分别分配每一行的代码(这被问到很多,但我找不到一个好的副本!)
// 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
的类型。