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

258

我需要一个大的 C 语言全局空数组。除了手动输入,还有其他方法吗?

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

?


36
零数组ZEROARRAY有1024个元素,它们的初始值都是0。 - user1831086
3
如果您需要在堆上分配内存,也可以使用calloc()。例如:char *zeroarray = calloc(1024, sizeof(*zeroarray)); - Andrei Ciobanu
3
注意:calloc对于char等类型是可以的,但如果你想要一个指针数组,你应该显式地将它们设置为NULL。荒谬的是,没有保证NULL表示为零字节。即使文字0隐式表示空指针。 - Adrian Ratnapala
1
可能是如何在C中初始化数组的重复问题。 - AechoLiu
2个回答

418

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

char ZEROARRAY[1024];

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

int arr[10] = {1, 2}; // arr[0] = 1, arr[1] = 2, others are 0
char ZEROARRAY[1024] = {0};
编译器会用零填充未写入的条目。或者你可以使用memset在程序启动时初始化数组:
memset(ZEROARRAY, 0, 1024);

如果您已更改它并希望将其重置为所有零,则这将非常有用。


7
{0}正常工作,符合C99标准[$6.7.8/21]。如果花括号括起来的初始化列表中的初始值少于聚合体中的元素或成员数量,或者用于初始化已知大小数组的字符串字面量中的字符少于数组中的元素数量,则聚合体的其余部分将被隐式初始化,与具有静态存储期的对象相同。 - Саша Зезюлинский
1
请参考:初始化的0不是“字符”,而是“整数”。 - Yonggoo Noh
1
{}讨论:https://dev59.com/EmMm5IYBdhLWcg3wdu5V memset不是显然正确的:我认为它只适用于0:https://dev59.com/SGgu5IYBdhLWcg3ws5FC - Ciro Santilli OurBigBook.com
2
如果它是一个结构体数组,并且在gcc中使用-Werror=missing-braces,则必须将其初始化为{{0}}。如果第一个结构体元素是另一个结构体,则为{{{0}}},以此类推。请参见https://dev59.com/qm035IYBdhLWcg3wZ_Qt。 - Tor Klingberg
3
今天我遇到了奇怪的... int arr[256]={1,2,7,{0}}; ... 这让我来到这里。直到看到这个东西,我甚至不知道部分清零是一种技巧。 - Neil Gatenby
显示剩余3条评论

54

如果您想将数组初始化为除0以外的值,使用gcc,您可以执行以下操作:

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

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


23
指定初始化器在 C99 中是标准的。使用 ... 表示范围是 GCC 特有的扩展。 - Keith Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接