【问题标题】:How to initialize array to 0 in C?如何在C中将数组初始化为0?
【发布时间】:2011-02-05 02:15:28
【问题描述】:

我需要一个 C 中的大空数组作为全局数组。除了打字还有什么办法吗

char ZEROARRAY[1024] = {0, 0, 0, /* ... 1021 more times... */ };

?

【问题讨论】:

  • char ZEROARRAY[1024] = { 0 };
  • 如果您需要在堆上分配内存,您也可以使用 calloc()。例如 char *zeroarray = calloc(1024, sizoef(*zeroarray)); .
  • 注: calloc 适用于char 等,但是如果您想要一个指针数组,则应将它们显式设置为 NULL,(荒谬!)不能保证 NULL 表示为零字节。即使文字 0 隐式表示空指针也是如此。

标签: c arrays initialization


【解决方案1】:

全局变量和静态变量自动初始化为零。如果你只是

char ZEROARRAY[1024];

在全局范围内它将在运行时全为零。但实际上如果你有一个本地数组,一种简写语法。如果数组已部分初始化,则未初始化的元素将接收到相应类型的值 0。你可以写:

char ZEROARRAY[1024] = {0};

编译器会用零填充未写入的条目。或者,您可以使用memset 在程序启动时初始化数组:

memset(ZEROARRAY, 0, 1024);

如果您更改了它并想将其重置为全零,那将很有用。

【讨论】:

  • {0};工作正常,C99 [$6.7.8/21] 如果大括号括起来的列表中的初始化程序少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文字中的字符少于现有的数组中的元素,聚合的其余部分应隐式初始化,与具有静态存储持续时间的对象相同
  • 请参考:初始化的0不是character。这是一个integer
  • {}讨论:stackoverflow.com/questions/17589533/…memset显然不正确:我认为它只适用于0:stackoverflow.com/questions/11138188/…
  • 如果是结构体数组,并且在gcc中使用-Werror=missing-braces,则必须初始化为{{0}}。如果第一个结构元素是另一个结构然后{{{0}}} 等等。见stackoverflow.com/questions/5434865/…
  • 今天我遇到了奇怪的...int arr[256]={1,2,7,{0}}; ...它把我带到了这里。在我看到它之前,我什至不知道这种部分归零是一回事。
【解决方案2】:

如果您想将数组初始化为 0 以外的值,您可以使用 gcc

int array[1024] = { [ 0 ... 1023 ] = -1 };

这是 C99 Designated Initializers 的 GNU 扩展。在较旧的 GCC 中,您可能需要使用 -std=gnu99 来编译您的代码。

【讨论】:

  • 指定初始化器在 C99 中是标准的。使用... 表示范围是gcc 特定的扩展。
猜你喜欢
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 2019-09-29
相关资源
最近更新 更多