编译器如何在 char array[100] = {0};中填充值? 它背后的魔力是什么?
char array[100] = {0};
我想知道内部编译器如何初始化。
实现取决于编译器开发人员。
如果你的问题是“这样的声明会发生什么”——编译器会将第一个数组元素设置为你提供的值(0) ,其他所有元素都会被设置为零,因为它是被忽略的数组元素的默认值。
这不是魔法。
C 语言中这段代码的行为在 C 规范(C 规格在线草案)的第6.7.8.21节中有描述: 对于没有指定值的元素,编译器将指向 NULL 的指针初始化,将算术类型初始化为零(并递归地将其应用于聚合)。
C + + 中这段代码的行为在 C + + 规范(C + + 规范在线草案)的8.5.1.7节中有描述: 编译器聚合-初始化没有指定值的元素。
另外,请注意,在 C + + (但不是 C)中,您可以使用一个空的初始化器列表,导致编译器聚合初始化数组的所有元素:
char array[100] = {};
至于这样做时编译器可能生成什么类型的代码,看看这个问题: 从数组0初始化的奇怪程序集
如果您的编译器是 GCC,您还可以使用以下语法:
int array[256] = {[0 ... 255] = 0};
请看 Http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/designated-inits.html#designated-inits ,注意这是一个 特定于编译器的特性。
这取决于您将这个初始化放在哪里。
如果数组是静态的,则为
char array[100] = {0}; int main(void) { ... }
然后是编译器在程序的数据段中保留100个字节。在这种情况下,您可以省略初始化程序。
如果你的数组是自动的,那就另当别论了。
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}; ... }
那么从技术上来说,它和第一个案子是一样的。