首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >array[100] = {0}如何将整个数组设置为0?

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

Stack Overflow用户
提问于 2009-03-10 05:25:42
回答 3查看 238.8K关注 0票数 142

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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)中,您可以使用一个空的初始化器列表,这会导致编译器聚合初始化数组的所有元素:

代码语言:javascript
复制
char array[100] = {};

至于当你这样做的时候编译器会生成什么样的代码,看一下这个问题:Strange assembly from array 0-initialization

票数 170
EN

Stack Overflow用户

发布于 2009-03-10 05:30:02

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

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

票数 35
EN

Stack Overflow用户

发布于 2009-03-10 10:05:45

这取决于你把这个初始化放在哪里。

如果数组是静态的,如

代码语言:javascript
复制
char array[100] = {0};

int main(void)
{
...
}

然后是编译器在程序的数据段中保留100个字节。在这种情况下,您可以省略初始化器。

如果你的数组是auto,那就是另一回事了。

代码语言:javascript
复制
int foo(void)
{
char array[100] = {0};
...
}

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

上面的代码等同于

代码语言:javascript
复制
int foo(void)
{ 
char array[100];

memset(array, 0, sizeof(array));
....
}

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

如果您的本地数组被声明为静态的,如

代码语言:javascript
复制
int foo(void)
{ 
static char array[100] = {0};
...
}

那么从技术上讲,它与第一个是相同的情况。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/629017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档