编译器如何在char array[100] = {0};
中填充值?它背后的魔力是什么?
我想知道编译器内部是如何初始化的。
发布于 2009-03-10 05:56:43
这不是魔法。
C规范(online draft of C spec)的6.7.8.21节描述了这段代码在C中的行为:对于没有指定值的元素,编译器将指向NULL和算术类型的指针初始化为零(并递归地将其应用于聚合)。
在C++规范(online draft of C++ spec)的8.5.1.7小节中描述了这段代码在C++中的行为:编译器聚合初始化没有指定值的元素。
另外,请注意,在C++ (而不是C)中,您可以使用一个空的初始化器列表,这会导致编译器聚合初始化数组的所有元素:
char array[100] = {};
至于当你这样做的时候编译器会生成什么样的代码,看一下这个问题:Strange assembly from array 0-initialization
发布于 2009-03-10 05:30:02
实现取决于编译器开发人员。
如果你的问题是“这样的声明会发生什么”-编译器会将第一个数组元素设置为你提供的值(0),而所有其他数组元素将被设置为零,因为它是省略的数组元素的默认值。
发布于 2009-03-10 10:05:45
这取决于你把这个初始化放在哪里。
如果数组是静态的,如
char array[100] = {0};
int main(void)
{
...
}
然后是编译器在程序的数据段中保留100个字节。在这种情况下,您可以省略初始化器。
如果你的数组是auto,那就是另一回事了。
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};
...
}
那么从技术上讲,它与第一个是相同的情况。
https://stackoverflow.com/questions/629017
复制相似问题