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

Iva*_* T. 2 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;
}
Run Code Online (Sandbox Code Playgroud)

这就是结果:

0
0
0
0
0
0
132049
0
Run Code Online (Sandbox Code Playgroud)

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

  1. 为什么数组的大小是8,而不是5?本来我以2的幂为单位来表示记忆,但我有一种错的感觉。
  2. 132049是什么?

L. *_* F. 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;
}
Run Code Online (Sandbox Code Playgroud)

这是保证打印的代码

#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;
}
Run Code Online (Sandbox Code Playgroud)

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