C中的结构和多维数组全局声明

时间:2017-04-03 09:31:30

标签: c multidimensional-array struct

我的目的是创建一个多维结构数组。然而,问题是它需要是一个全局变量,但我不知道编译时的大小(它是用户输入)。

假设我有一个像这样的结构:

typedef struct abc abc;
struct abc {
  int test;
  char* color;
};

我需要为此声明一个全局多维数组。

abc** board;

在代码后面的函数中,我想初始化大小并用值填充它:

board[height][width];

for(int i = 0; i < height; i++) {
    for(int x = 0; x <width; x++) {
        board[i][x].test = 0;
    }
}

我哪里错了?看来这部分是问题:董事会[身高] [宽度]?

2 个答案:

答案 0 :(得分:0)

@xing

回答

可以使用malloc为内存分配内存,可以使用board [x] [y]表示法访问它

board = malloc(height * sizeof(* board));然后在循环中将内存分配为board [i] = malloc(width * sizeof(** board));.该结构还有一个需要分配的char *

答案 1 :(得分:0)

有两种方法可以做到这一点。第一阶段在两种情况下都是相同的:分配一个指向abc的指针数组(假设用户已经为高度和宽度键入了值,并且您已经验证了它们)。

board = calloc(height, sizeof *board);

现在你有一个height空指针数组(纯粹主义者会说C标准无法保证这一点,但我们会忽略它们,因为它并不重要)。

现在,要么分配heightwidth结构数组

for (size_t i = 0 ; i < height ; ++i)
{
    board[i] = calloc(width, sizeof **board);
}

或者你为整个事情分配一个巨大的数组,并将指针设置为正确的偏移量。

abc *temp = calloc(width * height, sizeof *board);

for (size_t i = 0 ; i < height ; ++i)
{
    board[i] = &temp[i * width];
}

calloc的使用意味着每个结构都已经初始化为零位模式,这意味着在大多数平台上,test将为0,color将为空指针对于数组中的每个abc

如果您需要大量分配或height可能很大,第二个选项会更加不透明但效率更高。它也更容易解除分配,只需要两次调用free()

关于释放的主题,如果这个全局数组被分配一次并且具有整个程序的生命周期,那么你不需要为释放它而烦恼,因为当所有内存都将返回到操作系统时程序终止(除非你在嵌入式平台或没有虚拟内存的复古环境中)