如何在C中将数组初始化为0?


170

我需要C中有一个大的空数组作为全局数组。除了输入以外,还有其他方法吗

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


26
字符ZEROARRAY [1024] = {0};

3
如果您需要在堆上分配内存,也可以使用calloc()。例如char * zeroarray = calloc(1024,sizoef(* zeroarray)); 。
Andrei Ciobanu'4

2
NB calloc可以用于其他char方面,但是如果您想要一个指针数组,则应将它们显式设置为NULL,(荒唐!)不能保证NULL表示为零字节。即使文字0隐式表示空指针也是如此。
Adrian Ratnapala 2015年

Answers:


284

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

char ZEROARRAY[1024];

在全局范围内,运行时将全为零。但实际上一个速记语法,如果你有一个本地阵列。如果数组已部分初始化,则未初始化的元素将接收适当类型的值0。您可以这样写:

char ZEROARRAY[1024] = {0};

编译器将用零填充未写入的条目。另外,您可以memset在程序启动时用来初始化数组:

memset(ZEROARRAY, 0, 1024);

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


2
{0}; 工作正常,C99 [$ 6.7.8 / 21]如果用大括号括起来的列表中的初始化程序少于聚合的元素或成员,或者用于初始化已知大小的数组的字符串文字中的字符少于数组中的元素,聚合的其余部分应与具有静态存储持续时间的对象进行隐式初始化
Sasha Zezulinsky,2016年

请参阅:初始化的0不是character。这是一个integer
Yonggoo Noh


1
如果它是一个结构数组,并且-Werror=missing-braces在gcc中使用,则必须将其初始化为{{0}}。如果第一个struct元素是另一个结构,则{{{0}}}依此类推。见stackoverflow.com/questions/5434865/...
托尔克林伯格

1
今天我遇到了奇怪的…… int arr[256]={1,2,7,{0}};把我带到这里。直到我看到它,才知道这个部分归零的事情。
尼尔·盖特比

32

如果要将数组初始化为非0的值,gcc可以执行以下操作:

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

这是C99 指定的初始化程序的GNU扩展。在较旧的GCC中,您可能需要使用-std=gnu99来编译代码。


14
指定的初始化器是C99中的标准配置。使用...来表示的范围内是一个gcc专用的扩展。
基思·汤普森

1
那不是C99指定的初始值设定项,而是GCC特定的范围初始值设定项。为什么要参考GCC手册而不是C99标准?
Craig Barnes
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.