【问题标题】:C - How to initialise array of structures when the array size is large? [duplicate]C - 当数组大小很大时如何初始化结构数组? [复制]
【发布时间】:2026-02-01 16:10:01
【问题描述】:

假设我有一个结构:

struct foo{
    int field_1;
    int field_2;
};

说有一个数组:

foo bar[1000];

我知道你可以这样初始化数组:

foo bar[]={
{ .field_1= 10, field_2 = 20 },
{ .field_1= 30, field_2 = 40 },
};

当数组有 1000 个元素时,这根本不实用。我需要将所有元素初始化为一个特定的整数(在编译时),但看起来除非数组非常小,否则实际上不可能这样做。这似乎是一件必不可少的事情,但我找不到解决方案。

谢谢。

【问题讨论】:

  • 你可以使用循环。
  • 我应该提到我想在编译时这样做。
  • 在编译时没有很多选项。将初始化放在不同的文件中并#include 它至少您不需要查看它。
  • 您可以编写一个输出C源代码的程序来初始化整个数组。然后将该源代码包含到您的程序中。
  • 你可以把它作为全局变量或静态变量,因为它们是在编译时初始化的。

标签: c arrays


【解决方案1】:

您可以像这样使用 for 循环初始化结构 -

#include<stdio.h>

struct foo{
        int field_1;
        int field_2;
    };

int main(){

    int i;
    struct foo bar[1000];

    for(i=0; i<1000; i++){
        bar[i].field_1 = i;
        bar[i].field_2 = 2*i;
    }

    for(i=0; i<1000; i++){
       printf("bar[%d]:: field_1: %d field_2: %d\n", i, bar[i].field_1, bar[i].field_2);
    }
    return 0;
}

【讨论】:

  • 在您的解决方案栏中包含依赖于“i”或其他变量的整数。但是 OP 要求使用特定整数而不是一些关系值(如 i 和 2*i)进行初始化,并且在编译时也是如此。
  • 这只是一个例子。我知道你可以从 scanf() 或其他来源获取价值。
  • 是的,但是初始化应该在编译时进行。并且 scanf 或其他相关方法将在运行时工作!!!
【解决方案2】:

您可以简单地创建一个特殊的“生成器”程序,它为具有 1000 多个已初始化元素的数组输出所需的 C 源代码

【讨论】:

  • 是的,这似乎是我唯一的选择。谢谢。
【解决方案3】:

用您喜欢的语言(例如 Python)运行一个脚本,将这个数组写入头文件:

fileDesc = open('MyArray.h','wt')
fileDesc.write('#define MY_ARRAY \\\n{ \\\n')
for n in range(0,1000):
    fileDesc.write('\t{.field_1 = ' + '%5d'%(10+20*n) +
                   ' , .field_2 = ' + '%5d'%(20+20*n) + '}, \\\n')
fileDesc.write('}\n')
fileDesc.close()

然后,在源文件中,简单地包含自动生成的头文件并初始化数组:

#include "MyArray.h"
...
foo bar[] = MY_ARRAY;

【讨论】: