为什么 C++ 中没有定义 n 的 sizeof (array A[n]) 是固定的?

Why sizeof (array A[n]) without n defined in C++is fixed?

当我试图找到大小为 'n' 的 sizeof(A) 时,其中 A 是 int 类型,n 是一个未定义的 int。我得到 496 的输出,当我给 n 一个值然后检查它时,sizeof(A) 给我相同的值 496。 我知道 Array 是一种静态数据类型,因此无论 'n' 是什么,它都会有内存,但是谁能解释一下值 496 来自哪里?

int main()
{
    int n;
    int A[n];
    
    cout<<sizeof(A)<<"\n";
    
    cin>>n;
    
    cout<<sizeof(A);
    return 0;
}

where A is of type int with size as 'n'

int n;
int A[n];

A​​ 的类型不是“大小为 'n' 的整数”。 A 的类型是 int[n],它是 n 个整数的数组。但是,由于 n 不是编译时常量,因此程序格式错误。如果我们不考虑格式错误,n 的值是不确定的。读取不确定的值会导致未定义的行为。

anyone explain me where the value 496 came from?

它来自未定义的行为。您可以通过阅读产生该结果的已编译程序的程序集来找到更多详细信息。

代码中的第一个 cout 语句 cout<<sizeof(A)<<"\n"; 给出 0 作为输出。不管我将 n 作为输入,下一个 cout 语句也会给出 0。这里有两个声明,int nint A[n]。作为初学者,可以公平地假设 n 在两种情况下保持不变或具有相同的值,因此大小不应改变。但是,一个是integer(n),另一个是array of integer(A[n])。这让一切变得不同!

第一次打印 A[n] 的大小时,您得到的是 0,因为该数组只是声明而未初始化,所以我们知道它是空的。下一次,你将 n 作为输入,所以它的大小应该是 4 bytes(你自己试试),因为它是一个整数。

话虽如此,这实际上取决于您使用的编译器或操作系统的类型。我在其中一个在线编译器中得到 4 作为输出,当我尝试在代码块和 vscode 上实现它时,我分别得到了 3280。从本质上讲,即使 n 有垃圾值,这也是未定义的行为!