array [100] = {0}如何将整个数组设置为0?


Answers:


163

这不是魔术。

在C规范(C规范的在线草案)的第6.7.8.21节中描述了此代码在C中的行为:对于没有指定值的元素,编译器将指针初始化为NULL,并将算术类型初始化为零(并将其递归地应用于汇总)。

C ++规范的第8.5.1.7节(C ++规范的在线草案)中描述了此代码在C ++中的行为:编译器聚合初始化没有指定值的元素。

另外,请注意,在C ++(而不是C)中,您可以使用一个空的初始化程序列表,从而使编译器对数组的所有元素进行聚合初始化:

char array[100] = {};

至于执行此操作时编译器可能生成哪种代码,请看以下问题:数组0初始化的奇怪程序集


所有的C编译器都这样做吗?我被认为只有Visual Studio可以做到这一点。
JFA 2013年

1
C ++规范的在线草案已损坏,有人有新链接吗?
Behrooz Karjoo

35

具体实施取决于编译器开发人员。

如果您的问题是“这样的声明会发生什么”,编译器会将第一个数组元素设置为您提供的值(0),而所有其他元素将设置为零,因为这是省略数组元素的默认值。


我没有源,但是我很确定我在某处读到数组声明没有默认值。你得到的垃圾已经在那里。如果您仍然要覆盖这些值,那么浪费时间设置这些值没有任何意义。
瑞安·福克斯

10
瑞安(Ryan),如果未为第一个元素设置值,则整个数组未初始化且确实包含垃圾,但如果为至少一个元素设置值,则整个数组将被初始化,因此未指定的元素将隐式初始化为0.
qrdl

1
对于C ++,一个有界数组的空初始化列表将默认初始化所有元素。
dalle

2
@NatanYellin我在哪里说这个没有定义?在发表评论和投票之前,请阅读完整的答案。
qrdl 2012年

1
@qrdl你是对的。我误解了您对实施的评论。不幸的是,我现在无法更改投票。
Natan Yellin'4

27

如果您的编译器是GCC,则还可以使用以下语法:

int array[256] = {[0 ... 255] = 0};

请查看http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html#Designated-Inits,请 注意,这是特定编译器的功能。


欢迎!由于您要求查找更多此类技巧,因此我提供了
lakshmanaraj,2009年

1
如果您选择可以肯定地做到这一点,但是依赖像这样的编译器特定的扩展存在明显的缺点。
丹·奥尔森,2009年

@Dan Olson他的问题是询问特定于编译器的问题,因此发布了此内容。如果您觉得它没用,我将删除。
lakshmanaraj

5
这不是没有用的,它很有趣。注意事项值得一提。
丹·奥尔森,2009年

2
这样的事情使我重新回到SO并阅读了除头几个答案以外的更多内容……
timday 2009年

19

这取决于初始化的位置。

如果数组是静态的,如

char array[100] = {0};

int main(void)
{
...
}

然后是编译器在程序的数据段中保留100 0字节。在这种情况下,您可以省略初始化程序。

如果您的阵列是自动的,那就另当别论了。

int foo(void)
{
char array[100] = {0};
...
}

在这种情况下,每次调用函数foo时,您将拥有一个隐藏的内存集。

上面的代码等效于

int foo(void)
{ 
char array[100];

memset(array, 0, sizeof(array));
....
}

如果省略初始化程序,则数组将包含随机数据(堆栈数据)。

如果您的本地数组被声明为static,例如in

int foo(void)
{ 
static char array[100] = {0};
...
}

那么从技术上讲,它与第一种情况相同。

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.