【问题标题】:Using extern with multidimentional arrays in C在 C 中将 extern 与多维数组一起使用
【发布时间】:2021-12-14 16:33:13
【问题描述】:

我有一堆多维数组,它们分配在不同源文件的本地函数中,但我想让它们全局化。我正在考虑使用extern,根据this question,我需要制作一个头文件,其中包含我的变量的声明,然后定义该变量,仅一次,在一个源文件中。

但是,我用来生成多维数组的方法在一行中声明和定义变量,如下所示:

float (*data0)[224][3] = calloc(224, sizeof *data0);

有没有一种方法可以将其拆分为声明和定义,以便我可以使用此方法,或者在头文件本身中同时执行这两种方法会更好吗?


我正在用 C 语言实现神经网络,并且我在多个地方定义了很多这样的数组。起初我不认为我以后会需要它们,而且这应该在具有内存限制的嵌入式系统中运行,所以我将这些数组全部设为本地并尽快在它们上使用free

但事实证明,我需要它们来训练这个网络,所以我需要它们是全局的,以便它们在函数的多次迭代中保存它们的值。另外,我不知道我们将使用的系统会连接一个 64MB DRAM,所以内存限制不是什么大问题。

【问题讨论】:

    标签: c multidimensional-array extern


    【解决方案1】:

    如果您在全局范围内定义这些数组,则无需动态分配内存。与堆栈空间不同,全局变量的大小没有实际限制。

    所以假设你想要一个维度为 224、224 和 3 的 3D 数组,定义如下:

    float data0[224][224][3];
    

    然后在你的头文件中声明为:

    extern float data0[224][224][3];
    

    此外,全局变量默认为零初始化,因此不需要显式初始化程序。

    【讨论】:

    • 是的,这是有道理的。您可能想指出,因为它是一个全局的,所以您已经对数组进行了零初始化,就像calloc 提供的那样。 (C99 6.7. 8.10)
    • @RobertHarvey 啊,我明白了,谢谢,我正要问这个问题。但是,是像calloc 那样对每个变量的bytes 进行初始化,还是将浮点数的values 设置为零?
    • @Ricardo: stackoverflow.com/a/28601320: “令人高兴的是,无论如何,零实际上是零:IEEE-754(浮点的常用标准)将全零位模式搁置为含义相同零。”
    • @Ricardo 根据 C 标准,值设置为 +0,但是如果您的系统使用 IEEE754 浮点表示,那么字节也是 0。
    • 我明白了,谢谢,这回答了我所有的问题。
    猜你喜欢
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 2013-01-09
    • 2010-09-14
    • 1970-01-01
    相关资源
    最近更新 更多