通过读取用户的值创建一个包含 10 个整数的输入数组

Create an input array of 10 ints by reading values from the user

我正在尝试以下代码:

int main() {
    int x[10] ;
    int a[] = {1,2,3,4,5} ;
    int n ;
    int b[n] ;
    //int c[] ; gives compilation error

    cout<<sizeof(x)<<endl ; //prints 40
    cout<<sizeof(a)<<endl ; //prints 20
    cout<<sizeof(b)<<endl ; //prints 4
}

现在我的问题是当我定义 b 时到底发生了什么。 我曾尝试阅读类似问题的答案,但没有得到满意的答复。 因为数组是静态创建的,所以在声明它们时必须给出大小。那么为什么 b 的声明有效。 sizeof(b) 是否表示这只是被视为 int pointer

在 C++ 中,不允许使用可变长度数组,数组必须是固定大小的,如果您想动态分配大小,您可能需要使用 malloc 并手动分配内存。但是,int 的默认值在这里起作用。我不推荐这种做法,因为它可能会产生未定义的行为。阅读这些链接 Array[n] vs Array[10] - Initializing array with variable vs real number and Why aren't variable-length arrays part of the C++ standard? 他们有一些很好的解释。

what exactly happens

int n ;
int b[n] ;

使用未初始化整数(窄字符类型除外)的值具有未定义的行为(UB)。此外,由于 n 不是编译时常量,而是用作数组的大小,根据 C++ 标准,程序是病式的(这意味着允许编译器拒绝编译程序,并且至少需要显示诊断消息)。

但是,如果您的编译器支持可变长度数组(VLA,一种语言扩展),那么究竟会发生什么取决于编译器已经实现了 VLA(当然,它如何处理你引入的 UB)。

Then why is declaration of b valid.

事实上,在标准 C++ 中无效。

Does the sizeof(b) indicate that this just treated as a int pointer

没有。由于行为未定义,因此输出没有任何指示。即使 int 指针的大小恰好在您的系统上为 4,输出恰好相同也只是偶然。

首先,int b[n] 不是有效的 C++ 代码,除非 n 是常量表达式。你逃脱它只是因为你使用 GCC,并且它被允许作为扩展 (https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html#Variable-Length)。

其次,为了检查发生了什么,让我们看看这个:

我的程序 var-arr.cpp:

#include <iostream>

using namespace std;

int main() {
    int m=0, n=5, k;
    int a[m], b[n], c[k];
    cout
    << "sizeof(a)=" << sizeof(a)
    << " sizeof(b)=" << sizeof(b)
    << " sizeof(c)=" << sizeof(c)
    << endl;
}

下面是我编译 运行 时发生的情况([~/CPP] 是提示符)

[~/CPP] g++ -o var-arr var-arr.cpp
[~/CPP] ./var-arr
sizeof(a)=0 sizeof(b)=20 sizeof(c)=0

一段时间后

[~/CPP] ./var-arr
Segmentation fault (core dumped)

这是什么意思?这意味着当你在一个函数中写 int n; 时,n 保持未初始化状态。所以当你在它后面写 int a[n]; 时,a 的长度可以是任何东西。它也可能太大而无法分配 a.