未定义行为的说明,以及是否确实未定义

时间:2019-07-10 07:30:36

标签: c++ arrays

我已经为5个元素的数组动态分配了内存,然后尝试将其元素打印到std::cout,这应该给我带来相当简单的结果。相反,我还有别的东西,这让我有些疑问。

我的代码:

#include <iostream>

int main()
{
    int *array = new int[5];

    int array_size = sizeof(array);
    for (int index = 0; index < array_size; index++) {
        std::cout << array[index] << "\n";
    }
    std::cout << "\nThe array is " << array_size << " elements long.";

    return 0;
}

这就是结果:

0
0
0
0
0
0
132049
0

现在,我知道这不是事情的完成方式,但是这样的结果使我有几个问题。

  1. 为什么数组的大小是8,而不是5?最初,我认为应该以2的幂为单位进行记忆,但是我感觉自己是错的。
  2. 132049是什么?

1 个答案:

答案 0 :(得分:5)

您的代码有两个问题,每个问题都会导致未定义的行为。

首先,sizeof(array)是指针的大小(以字节为单位),而不是数组。在您的计算机上,指针恰好占用8个字节。这会导致超出范围的访问,这是未定义的行为。

第二,new int[5]为您提供了未初始化的数组。访问未初始化对象的值是未定义的行为。

要解决这些问题,请首先注意new返回的数组的大小会丢失。 sizeof无法帮助您。您只能自己提供此信息。然后,您必须初始化元素。

#include <iostream>

int main()
{
    int *array = new int[5]{}; // note: initialization

    int array_size = 5;
    for (int index = 0; index < array_size; index++) {
        std::cout << array[index] << "\n";
    }
    std::cout << "\nThe array is " << array_size << " elements long.";

    return 0;
}

这是保证可以打印的代码

0
0
0
0
0

The array is 5 elements long.

(只要有足够的内存并且输出成功)