为全局多维数组分配内存



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

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));

或者换句话说,为我的[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的类型。

相关内容

  • 没有找到相关文章

最新更新