【问题标题】:how does array[100] = {0} set the entire array to 0?array[100] = {0} 如何将整个数组设置为 0?
【发布时间】:2010-10-12 08:33:15
【问题描述】:

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

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

【问题讨论】:

  • 在 C 或 C++ 中?它们是两个独立的问题。

标签: c++ c compiler-construction


【解决方案1】:

这不是魔法。

此代码在 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

【讨论】:

  • 所有 C 编译器都这样做吗?我被引导相信只有 Visual Studio 才能做到这一点。
  • c++ 规范的在线草稿已损坏,有人有新链接吗?
【解决方案2】:

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

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

【讨论】:

  • 我没有来源,但我很确定我在某处读到数组声明没有默认值;你会得到任何已经存在的垃圾。当您无论如何都可能覆盖它们时,浪费时间设置这些值是没有意义的。
  • Ryan,如果你没有为第一个元素设置整个数组未初始化并且确实包含垃圾的值,但是如果你为它的至少一个元素设置了一个值,整个数组就会变成已初始化,因此未指定的元素被隐式初始化为 0。
  • 对于 C++,有界数组的空初始化列表默认初始化所有元素。
  • @NatanYellin 我在哪里说这是未定义的?请在评论和投票之前阅读完整的答案。
  • @qrdl 你是对的。我误解了您对实施的评论。很遗憾,我现在无法更改投票。
【解决方案3】:

如果您的编译器是 GCC,您还可以使用以下语法:

int array[256] = {[0 ... 255] = 0};

请看 http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html#Designated-Inits,请注意这是一个编译器特有的功能。

【讨论】:

  • 欢迎您!既然你要求寻找更多这样的技巧,我已经提供了
  • 如果你愿意,你当然可以这样做,但是依赖像这样的特定于编译器的扩展有明显的缺点。
  • @Dan Olson 他自己的问题是询问特定于编译器的问题,因此发布了这个。如果你觉得没用,我就删了。
  • 不是没用,很有趣。警告值得一提。
  • 像这样的东西让我回到 SO 并且阅读的不仅仅是前几个答案......
【解决方案4】:

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

如果数组是静态的

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};
...
}

那么它在技术上与第一个相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    相关资源
    最近更新 更多