我的意图是创建一个多维结构数组。但是,问题是它需要是一个全局变量,但我不知道编译时的大小(它是用户输入的)。
假设我有一个这样的结构:
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;
}
}
我哪里错了?这部分似乎是问题所在:board[height][width] ?
最佳答案
有两种方法可以做到这一点。在这两种情况下,第一阶段是相同的:分配一个指向 abc 的指针数组(假设用户已经输入了高度和宽度的值并且您已经验证了它们)。
board = calloc(height, sizeof *board);
现在你有了一个 height
空指针数组(纯粹主义者会说 C 标准不能保证这一点,但我们会忽略它们,因为这无关紧要)。
现在,要么分配 height
数组的 width
结构
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()
。
关于释放的问题,如果这个全局数组被分配一次并且有整个程序的生命周期,你不需要费心去释放它,因为当程序终止时所有的内存都会返回给操作系统无论如何(除非你在嵌入式平台或没有虚拟内存的复古环境中)
关于c - C 中的结构和多维数组全局声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43181088/