代码之家  ›  专栏  ›  技术社区  ›  david_10001

如何使用函数外部的for循环创建多个全局变量?[副本]

c
  •  1
  • david_10001  · 技术社区  · 7 年前

    这个问题已经有了答案:

    我有一个列表,我想为列表中的每个项目创建一个全局计数器,初始值设置为 1 . 我以为我会用 for 循环(我的实际列表比下面的例子大很多),但是我刚刚意识到 对于 循环不能在函数之外工作。如何使下面的代码工作?

    char* list[] = {"A", "B", "C"};
    
    for (int i = 0; i < sizeof(list); i++){
        int counter[i] = 1;
        }
    }
    
    2 回复  |  直到 7 年前
        1
  •  4
  •   alk    7 年前

    这就是你想要的吗?

    char* list[] = {"A", "B", "C"};
    int counter[] = {1, 1, 1};
    

    只需全局声明它们并初始化 counter 就像你初始化 list .

    也可以申报 柜台 全局,然后在中初始化 main() 或者在任何地方 for 循环:

    char* list[] = {"A", "B", "C"};
    int counter[3];
    
    int main(void) {
        for (int i = 0; i < sizeof(list) / sizeof(*list); i++) {
            counter[i] = 1;
        }
    }
    

    或者更好,找出你需要多少内存 柜台 根据 列表 :

    char* list[] = {"A", "B", "C"};
    int *counter;
    
    int main(void) {
        int numElements = sizeof(list) / sizeof(*list);
    
        counter = malloc(numElements * sizeof(*counter));
        // check for malloc() failure
    
        for (int i = 0; i < numElements; i++) {
            counter[i] = 1;
        }
    }
    

    注意你不能简单地使用 sizeof(list) …这将返回多少内存 列表 已分配。你需要分开 sizeof(列表) 根据每个元素的大小, sizeof(*list) ,以获取元素的数目

        2
  •  3
  •   StoryTeller - Unslander Monica    7 年前

    C没有在函数之外运行此类初始化代码的功能。由于文件范围内静态变量的初始值设定项需要是常量表达式,因此有两个选项:

    1. 用您选择的脚本语言创建一个脚本,该脚本生成一个大小合适的初始值设定项宏,供您用作数组的初始值设定项。例如,脚本可以读取此文件:

      #include "my_init_list.h"
      char* list[] = {"A", "B", "C", /* However many more */};
      int counter[] = COUNTERS_INITIALIZER;
      

      它将分析初始值设定项 list ,并输出文件 my_init_list.h 它将包含宏 COUNTERS_INITIALIZER 扩展到 {1, 1, ..., 1} . 如果您将脚本作为构建过程中的一个步骤运行,那么应该这样做。

    2. 将初始化代码放入一个函数中,并在程序启动代码的早期运行一次函数(什么 main 开始运行时执行)。