【问题标题】:Strange numbers when array is not initialized in C++ [duplicate]未在 C++ 中初始化数组时出现奇怪的数字 [重复]
【发布时间】:2015-08-23 12:26:42
【问题描述】:

编辑:^^^“重复”根本没有提到数组
EDIT2:坚持这是C,而不是C++,两种语言之间没有区别吗?!

这个问题最近一直困扰着我一段时间。 Google 搜索一无所获。

所以我有这个示例 C++ 代码的 sn-p:

int factors[100]; /* note this is not initialized */
int number = /* less than 100 */ 10;
for (int i = 0; i < number; i ++) {
    factors[i] = 1;
}
for (int i = 0; i < 100; i ++) {
    std::cout << factors[i] << std::endl;
}

输出是(向下滚动到底部)

1
1
1
1
1
1
1
1
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1640775680
32767
114023525
624860211
174064279
236792104
-1027703263
587262357
1599638600
32767
17
0
1
0
6778984
1
1640935824
32767
1599638352
32767
1640780406
32767
1599638384
32767
1599638384
32767
1
0
1599638408
32767
6778880
1
1640776264
32767
1599638424
32767
0
0
0
0
0
0
0
0
0
0

为什么不是十个 1 或十个 1 和九十个 0,为什么有这么多看似随机的(可能与 2 的幂有关?)数字?我认为这可能与内存分配或其他东西有关,但我只是一个初学者,我还没有接触到这些东西。

【问题讨论】:

  • int factors[100] = {0};
  • 不要让它困扰你。别担心,使用std::vector,祝你快乐!
  • @PaulMcKenzie:即使这样也不能保证。尽管 C++ 标准不使用该术语,但 C 标准讨论了仅通过尝试读取未初始化的值就可以做奇怪事情(如产生信号或关闭程序)的值。
  • @raumaankidwai ""duplicate" 根本没有提到数组" 而且您观察到的行为与数组无关,并在欺骗中进行了解释。
  • @BaummitAugen,我认为是时候放弃这里了。不会教的人就无法教......

标签: c++ arrays


【解决方案1】:

如果你有声明

int factors[100]; /* note this is not initialized */

有两种情况:

  1. 当声明为全局(文件范围)变量时,整个数组将在程序启动之前初始化为零。

  2. 当声明为局部(函数范围)变量时,数组未初始化,将包含不可预知的数字。

【讨论】:

  • 好的,所以如果我想防止这种情况发生,我可以将我的所有数组移动到int main () { } 之外?
  • 是的,这将使它们成为全局变量,因此初始化为零。
  • @raumaankidwai 请不要那样做。如果需要,您应该将它们显式初始化为零。
  • C++ 委员会决定他们不会要求编译器在不需要的时候做一些需要时间的事情。所以如果你没有指定初始化,它不需要生成代码来初始化你的数组,因为它可能会增加二进制大小并稍微篡改执行速度。与为什么 new int() 返回垃圾以及为什么在执行超出函数范围时没有清理堆栈空间的原因相同
  • int factors[100] = {}; 默认将所有内容初始化为 0。拥有第一个0 只会确定第一个数字是什么。你可以做int factors[100] = {5}; 这将使factors[0] == 5 和其他一切0
【解决方案2】:

未初始化的数组被垃圾值填充。垃圾值是在用户请求之前存在于该特定内存位置的值。内存位置一直存在。在许多情况下,输出为 0,因为编译器显式写入默认值在返回这些位置之前。但是 C/C++ 编译器并不总是表现出这种行为,因此存在不同的输出。

【讨论】:

    【解决方案3】:

    就是这样,如果你不初始化你的数组,C++ 不保证它会是空白的

    【讨论】:

    • 但是为什么会这样呢?
    • 因为改变它们的值需要时间,如果你无论如何都要覆盖它们,那么宝贵和浪费的时间
    • 需要注意的是静态存储中的变量会被初始化为零。
    • 因为操作系统为您的代码分配了内存。它没有为其设置任何值。假设您在内存地址 0xf000000 中有值 3 用于先前运行的软件,然后该软件停止并且您的软件获得相同的地址。那里的值还是3
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多