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}; ... }
那么在技术上与第一个相同。