2

当我试图找到 sizeof(A) 其中 A 是 int 类型且大小为“n”时,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;
}
4

2 回答 2

5

其中 A 是 int 类型,大小为 'n'

int n;
int A[n];

A 的类型不是“int with size as 'n'”。A 的类型是 int[n],它是 n 个整数的数组。但是,由于 n 不是编译时间常数,因此程序格式错误。如果我们看过去的病态, 的价值 n是不确定的。读取不确定的值会导致未定义的行为。

任何人解释我的价值 496 来自哪里?

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

于 2021-08-31T03:41:37.783 回答
-3

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

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

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

于 2021-08-31T04:26:31.863 回答