我的目的是创建一个多维结构数组。然而,问题是它需要是一个全局变量,但我不知道编译时的大小(它是用户输入)。
假设我有一个像这样的结构:
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;
}
}
我哪里错了?看来这部分是问题:董事会[身高] [宽度]?
答案 0 :(得分:0)
可以使用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标准无法保证这一点,但我们会忽略它们,因为它并不重要)。
现在,要么分配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()
。
关于释放的主题,如果这个全局数组被分配一次并且具有整个程序的生命周期,那么你不需要为释放它而烦恼,因为当所有内存都将返回到操作系统时程序终止(除非你在嵌入式平台或没有虚拟内存的复古环境中)