分配二维结构数组

3no*_*tur 0 c struct multidimensional-array

我想分配一个自定义类型“cell”的二维数组,它是一个结构。但是,我做错了,请参阅下面的代码。你能告诉我我的错误在哪里吗?

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
  int variable_1;
  int variable_2;
  int variable_3;
} cell;


void initialiseArray(unsigned long rows, unsigned long columns, cell array[rows][columns])
{
  for (int i = 0; i < rows; i = i + 1)
    for (int j = 0; j < columns; j = j + 1)
    {
      array[i][j].variable_1 = 0;
      array[i][j].variable_2 = 0;
      array[i][j].variable_3 = 0;
    }
}

int main()
{
  unsigned long rows = 200;
  unsigned long columns = 250;
  cell* array[rows];
  for (unsigned long i = 0; i < rows; i = i + 1)
    array[i] = malloc(columns * sizeof(cell));


  if (array == NULL)
  {
    printf("Error in ""main"": Memory could not be allocated.\n");
    return 3;
  }

  initialiseArray(rows, columns, array);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

All*_*ind 6

cell* array[rows];是在堆栈上分配的可变长度数组 (VLA);每行都在堆上分配array[i] = malloc(columns * sizeof(cell));

array我建议您在堆栈或堆上分配:

  1. 堆:
    cell array[rows][columns];
    initialiseArray(rows, columns, array);
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您无法初始化 VLA,因此您仍然需要initialiseArray()(或使用memset())。在 Linux 上,默认堆栈大小为 8 MB,如果您尝试使用超过该大小,您的程序可能会出现段错误。

  1. 堆:
    cell (*array)[rows][columns] = malloc(sizeof *array);
    initialiseArray(rows, columns, *array);
Run Code Online (Sandbox Code Playgroud)

正如 @yano 提到的,您可以使用calloc()对内存进行零初始化,因此您不一定需要调用initialiseArray(). 在 Linux 上,限制是可用物理内存 + 交换空间的大小(例如 16 GB),如果您尝试使用超过可用的malloc()/calloc()将返回 NULL,您可以轻松处理。

在这种情况下,两者都可以。如果rowscolumns仅在运行时知道,则更喜欢堆分配。

更喜欢传递变量而不是 的类型sizeof

虽然ij是完全有效的循环变量,但在这种情况下请考虑使用r/rowc/ col/ column