【问题标题】:Why sizeof (array A[n]) without n defined in C++is fixed?为什么在 C++ 中没有定义 n 的 sizeof (array A[n]) 是固定的?
【发布时间】:2021-10-29 16:45:59
【问题描述】:

当我尝试查找 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;
}

【问题讨论】:

  • 这不是有效的 C++。 n 不仅从未初始化,它也不是编译时间常数。虽然一些编译器支持可变长度数组,但标准不支持。另请注意:A 没有类型 int。它的类型为int[n]
  • 两个sizeof函数的输出都是496。
  • n 的值在您使用它时是未指定的,因此您的程序的行为是未定义的。此外,可变长度数组不是 C++ 的标准部分,即使可用,通常也不应使用它们。
  • 未定义的行为是未定义的。 496 与任何其他结果、无结果、崩溃或您的计算机着火的可能性一样。
  • @alfC - 我不太关心编译器,因为有许多 C++ 编译器支持 VLA 作为非标准扩展(不支持任何非标准扩展的编译器是像母鸡的牙齿一样稀有)。我更担心老师告诉学生尝试它的事实 - 以暗示它是正确的方式,当它不是时。我对提供信息的老师没有意见(虽然这是非标准的,但您会发现一些 C++ 编译器支持 VLA),但对提供“试试看,它有效”建议的老师确实有意见。

标签: c++ sizeof variable-length-array gcc-extensions


【解决方案1】:

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

int n;
int A[n];

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

谁能解释一下 496 的值是从哪里来的?

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

【讨论】:

  • 是的,'n' 在首先声明它之后只是在其中有一个垃圾,一旦我重新加载程序,值就改变了。
  • @Itzz_CJ 这是未定义的行为。如果您再次运行程序,行为可能会改变 - 但不能保证会改变。对程序的行为没有任何保证。
【解决方案2】:

代码中的第一个cout 语句cout&lt;&lt;sizeof(A)&lt;&lt;"\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 具有垃圾值,这也是一种未定义的行为!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-04
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 2011-01-19
    • 2023-03-05
    • 2015-09-02
    相关资源
    最近更新 更多