当我试图找到大小(A),其中A是类型int,大小为'n‘时,n是一个未定义的int。我得到了496的输出,当我给n一个值,然后检查它时,sizeof of (A)给出的值与496相同。我知道Array是一种静态数据类型,所以它将有内存,而不管'n‘,但是有人能解释一下值496来自哪里吗?
int main()
{
int n;
int A[n];
cout<<sizeof(A)<<"\n";
cin>>n;
cout<<sizeof(A);
return 0;
}
发布于 2021-08-30 19:41:37
,其中A是int类型,大小为'n‘
int n;
A的类型不是“整数,大小为'n'”。A的类型是intn,它是n个整数的数组。但是,由于n不是编译时间常数,所以程序格式不正确.如果我们忽略了不良状态,那么n
的价值是不确定的.读取不确定的值会导致未定义的行为。
有人解释我496是从哪里来的吗?
它来自于不明确的行为。通过读取生成该结果的已编译程序的程序集,可以找到更多详细信息。
发布于 2021-08-30 20:26:31
代码中的第一个cout
语句cout<<sizeof(A)<<"\n";
将0
作为输出。不管我接受什么n
作为输入,下一个cout
语句也会给出一个0
。这里有两个声明,int n
和int A[n]
。作为初学者,公平地假设n
在两种情况下都是相同的,或者具有相同的值,因此大小不应该改变。然而,一个是integer(n)
,另一个是array of integer(A[n])
。一切都不一样了!
当您第一次打印A[n]
的大小时,您将得到一个0
,因为数组只被声明,而不是初始化,因此我们知道它是空的。下一次,您将n
作为输入,因此它的大小应该是4 bytes
(自己试试),因为它是一个整数。
尽管如此,它确实取决于您正在使用的编译器或操作系统的类型。我在一个在线编译器中获得了4
作为输出,当我尝试在代码块和vscode上实现它时,我分别得到了32
和80
。本质上,这是一种未定义的行为,即使n
有一个垃圾值!
https://stackoverflow.com/questions/68992461
复制