为全局多维数组分配内存

时间:2014-06-25 03:47:33

标签: c arrays multidimensional-array malloc

我想读一个文件,其第一行给出了数组的尺寸。例如:

4 3

然后我希望我的程序分配rows = 4columns = 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]内存是否正确?

2 个答案:

答案 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的类型也是如此。