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

C语言中的结构和多维数组全局声明,c,multidimensional-array,struct,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++) {

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

假设我有这样一个结构:

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[高度][宽度];
对于(int i=0;i
malloc可用于向线路板分配内存,并可使用线路板[x][y]符号进行访问

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

malloc可用于向线路板分配内存,并可使用线路板[x][y]符号进行访问


board=malloc(height*sizeof(*board));然后在循环中将内存分配为board[i]=malloc(width*sizeof(**board));该结构还有一个需要分配的char*,有两种方法。第一步在两种情况下都是相同的:分配一个指向abc的指针数组(假设用户已经键入了高度和宽度的值,并且您已经验证了它们)

现在有了一个
height
null指针数组(纯粹主义者会说C标准不能保证这一点,但我们会忽略它们,因为这无关紧要)

现在,您可以分配
height
结构的
width
数组

for (size_t i = 0 ; i < height ; ++i)
{
    board[i] = calloc(width, sizeof **board);
}
用于(尺寸i=0;i
或者,您为整个事件定位一个巨大的数组,并将板中的指针设置为正确的偏移量

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

for (size_t i = 0 ; i < height ; ++i)
{
    board[i] = &temp[i * width];
}
abc*temp=calloc(宽度*高度,尺寸*板);
用于(尺寸i=0;i<高度;++i)
{
板[i]=&温度[i*宽度];
}
使用
calloc
意味着每个结构都已经用零位模式初始化,这意味着在大多数平台上,
test
将是0,
color
将是数组中每个
abc
的空指针

第二个选项有点不透明,但如果您需要大量分配,或者如果
高度
可能很大,则效率会更高。取消分配也更容易,只需要两次调用
free()


关于释放问题,如果这个全局数组只分配一次,并且有整个程序的生命周期,您就不必费心释放它,因为当程序终止时,所有内存都将返回操作系统(除非您在嵌入式平台或没有虚拟内存的追溯环境中)

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

现在有了一个
height
null指针数组(纯粹主义者会说C标准不能保证这一点,但我们会忽略它们,因为这无关紧要)

现在,您可以分配
height
结构的
width
数组

for (size_t i = 0 ; i < height ; ++i)
{
    board[i] = calloc(width, sizeof **board);
}
用于(尺寸i=0;i
或者,您为整个事件定位一个巨大的数组,并将板中的指针设置为正确的偏移量

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

for (size_t i = 0 ; i < height ; ++i)
{
    board[i] = &temp[i * width];
}
abc*temp=calloc(宽度*高度,尺寸*板);
用于(尺寸i=0;i<高度;++i)
{
板[i]=&温度[i*宽度];
}
使用
calloc
意味着每个结构都已经用零位模式初始化,这意味着在大多数平台上,
test
将是0,
color
将是数组中每个
abc
的空指针

第二个选项有点不透明,但如果您需要大量分配,或者如果
高度
可能很大,则效率会更高。取消分配也更容易,只需要两次调用
free()


关于释放问题,如果这个全局数组只分配一次,并且有整个程序的生命周期,您就不必费心释放它,因为当程序终止时,所有内存都将返回操作系统(除非您在嵌入式平台或没有虚拟内存的追溯环境中)

abc**board;
与数组相去甚远。好的,你能解释一下原因吗?@souravghosh因为数组不是指针,反之亦然。那么你如何声明多维数组呢?@xing谢谢,但我怎么知道全局变量中需要初始化多少内存呢?
abc**board;
与数组相去甚远。好的,可以吗你解释一下原因吗?@souravghosh因为数组不是指针,反之亦然。嗯,那么你如何声明多维数组呢?@xing谢谢,但是我怎么知道全局变量中要初始化多少内存呢?