【问题标题】:Why doesn't this code generate an error on using a variable array size?为什么这段代码在使用可变数组大小时不会产生错误?
【发布时间】:2015-06-13 01:30:58
【问题描述】:

下面的代码应该会产生错误,因为编译器在编译期间无法知道数组大小。

int f;
std::cin >> f;
int c[f];
c[100] = 5;

我正在使用 gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2 进行编译,它不只是编译,而是以某种方式运行。

这是怎么发生的?

【问题讨论】:

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


【解决方案1】:

C++ 不进行数组边界检查。 line c[100] = 5; 等价于 *(c + 100) = 5;。您只是告诉编译器写入与另一个内存位置有一定偏移的内存位置。如果您在程序中输入小于 100 的任何内容,您将覆盖堆栈上的一些数据。根据其余代码的作用,这可能会导致堆栈溢出,由于某些重要数据被覆盖而导致“随机”崩溃,或者它可以正常工作(然后当一些看似无关的更改更改时开始随机崩溃)内存布局)。

【讨论】:

  • 您的描述是正确的,但与真正关于为什么int c[f]; 行在f 不是编译时常量时编译的问题并不真正相关..
  • 我确实认出了那部分。我只是添加它以确保我实际上是在创建一个数组。但我认为这对遇到这个问题的其他人很有用。
【解决方案2】:

C99 accepts variable length arrays, and gcc accepts them as an extension in C90 and C++.

在 C++ 代码中使用 -pedantic-Wvla 会将其变为警告,-Werror=vla 会将其变为错误。

【讨论】:

  • 谢谢。我没有考虑查看 C 标准。
猜你喜欢
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
  • 2020-08-30
  • 2018-04-19
  • 1970-01-01
相关资源
最近更新 更多