内存的价值是什么?

时间:2019-05-09 22:57:40

标签: c++

问题1:我的朋友问我一个问题,我想证明我的理解是正确的。如果我声明一个特定大小的数组,但不指定每个元素的值,则将其打印出来,得到全0。但这是使它们正确为0的编译器吗?我只需要声明一个X大小的数组,就可以分配一个正确大小的连续块吗?我不应该指望它们始终为零,而应该自己手动对其进行初始化。

问题2:我在留言板上读到,较新的c ++可以让您声明具有用户定义大小的数组。这对我来说没有意义,我一直认为需要在编译时就知道它。怎么了这是语法糖吗?幕后到底是怎么回事?

#include <iostream>

using namespace std;

void question2()
{
    int userInput;
    cin >> userInput;

    int anotherArray[userInput];
}

int main()
{
    int array[5];

    for (int i = 0; i < 5; i++) {
        cout << array[i] << endl;
    }
    cout << endl;

    question2();
}

我期望main产生混乱的输出,并提示类似“ userInput not const”的错误 但是我得到0 0 0 0 0和用户输入,并且进程在2.857秒后退出,返回值为0

2 个答案:

答案 0 :(得分:6)

  

如果我声明某个大小的数组,但未指定每个元素的值,则将其打印出来,则得到全0。但这就是使它们正确为0的编译器吗?

正确。

  

我只需要声明一个X大小的数组,就是它将分配一个正确大小的连续块?

正确。

  

我不应该指望它们始终为零,而应自己手动对其进行初始化。

正确。

您可能会看到编译器会帮忙进行额外的工作,因为它是调试版本。通常,这些值是不确定的,并且读取它们具有不确定的行为(并且您可以期望得到任何旧的垃圾;这不只是学术上的。)


  

我在留言板上读到,较新的c ++可以让您声明具有用户定义大小的数组。这对我来说没有意义,

忽略留言板的充分理由。

  

我一直认为它需要在编译时就知道。

您一直都是对的。

  

这是怎么回事?这是语法糖吗?

C具有“可变长度数组”。 GCC允许它们作为C ++的扩展;忽略它。

  

引擎盖下发生了什么事?

更复杂的stack magic


  

我会期望main发出混乱的输出,并显示类似“ userInput not const”之类的错误,但我得到0 0 0 0 0和用户输入,并且进程在2.857秒后退出,返回值为0

零是有效的乱码结果,并且编译器允许使用VLA(如上所述);如果您进入“适当的” C ++模式(例如by passing -Werror=vla to GCC),它将更加严格。我建议。

答案 1 :(得分:3)

  

我不应该指望它们始终为零,而应自己手动对其进行初始化。

对于自动变量(不仅仅是数组),可以。静态变量(尤其是在文件范围内定义的静态变量)在编译时由编译器设置为零。

要将数组初始化为零,您可以利用以下事实:部分初始化的任何事物都将未初始化的成员设置为零。因此,您可以不使用任何成员对其进行初始化,并且将“其他”免费设置为零:

int array[5] = {};