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

编译器如何填充char array[100] = {0}; ? 它背后的魔法是什么?

我想知道内部编译器如何初始化。

这不是魔术。

C代码的行为在C规范( C规范的在线草案)的 6.7.8.21节中描述:对于没有指定值的元素,编译器将指针初始化为NULL,算术types为零(并recursion地将其应用于聚合)。

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

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

 char array[100] = {}; 

至于编译器在执行此操作时可能生成哪种代码,请看下面这个问题: 从数组0初始化程序集

实现取决于编译器开发人员。

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

如果你的编译器是GCC,你也可以使用下面的语法:

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

请查看http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html#Designated-Inits ,并注意这是一个编译器特有的function。

这取决于你把这个初始化。

如果数组是静态的

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

那么编译器会在程序的数据段中保留100 0字节。 在这种情况下,您可能已经省略了初始化程序。

如果你的数组是自动的,那么这是另一回事。

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

在这种情况下,每次调用函数foo时,都会有一个隐藏的memset。

上面的代码相当于

 int foo(void) { char array[100]; memset(array, 0, sizeof(array)); .... } 

如果你省略了初始化器,你的数组将包含随机数据(堆栈的数据)。

如果你的本地数组被声明为静态的就像

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

那么在技术上与第一个相同。