【发布时间】:2010-10-12 08:33:15
【问题描述】:
编译器如何填充char array[100] = {0}; 中的值?它背后的魔力是什么?
我想知道编译器内部是如何初始化的。
【问题讨论】:
-
在 C 或 C++ 中?它们是两个独立的问题。
标签: c++ c compiler-construction
编译器如何填充char array[100] = {0}; 中的值?它背后的魔力是什么?
我想知道编译器内部是如何初始化的。
【问题讨论】:
标签: c++ c compiler-construction
这不是魔法。
此代码在 C 中的行为在 C 规范 (online draft of C spec) 的第 6.7.8.21 节中进行了描述:对于没有指定值的元素,编译器将指针初始化为 NULL 并将算术类型初始化为零(并递归地将其应用于聚合)。
此代码在 C++ 中的行为在 C++ 规范 (online draft of C++ spec) 的第 8.5.1.7 节中进行了描述:编译器聚合初始化没有指定值的元素。
另外,请注意,在 C++(但不是 C)中,您可以使用空的初始化列表,导致编译器聚合初始化数组的所有元素:
char array[100] = {};
至于你这样做时编译器可能会生成什么样的代码,看看这个问题:Strange assembly from array 0-initialization
【讨论】:
实现取决于编译器开发人员。
如果您的问题是“这样的声明会发生什么” - 编译器会将第一个数组元素设置为您提供的值 (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 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};
...
}
那么它在技术上与第一个相同。
【讨论】: