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

标签 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;
    }
}

我哪里错了?这部分似乎是问题所在: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/

相关文章:

c - 结构指针数组 - 覆盖结构

c - 声明这个巨大结构的更好方法?

c - 关于堆栈帧

MySQL C 连接器/mysql_autocommit 函数

javascript - 测试未初始化的数组元素不起作用

java - 获取二维数组的边缘值,同时防止越界

c - 我收到错误 "warning: assignment to ' char' from 'char *' made integer frompointer without a Cast”

c - UDP 和 TCP 之间的同步

c - 静态矩阵或动态分配矩阵

C:打印二维数组的问题