为什么此代码在使用可变数组大小时不会生成错误?
Why doesn't this code generate an error on using a variable array size?
下面的代码应该会生成一个错误,因为编译器在编译过程中无法知道数组大小。
int f;
std::cin >> f;
int c[f];
c[100] = 5;
我使用gcc(Ubuntu 4.8.2-19ubuntu1)4.8.2进行编译,它不仅可以编译,而且可以以某种方式运行。
这是怎么发生的?
C99接受可变长度数组,gcc接受它们作为C90和C++中的扩展。
使用-pedantic
或-Wvla
会将其转化为C++代码中的警告,而-Werror=vla
会将其转变为错误。
C++不执行数组边界检查。line c[100] = 5;
相当于*(c + 100) = 5;
。您只是告诉编译器在与另一个内存位置的某个偏移量处写入内存位置。如果在程序中输入的值小于100,则会覆盖堆栈中的一些数据。根据代码的其余部分所做的操作,这可能会导致堆栈溢出、某些重要数据被覆盖时的"随机"崩溃,或者它可能正常工作(然后当一些看似无关的更改更改更改内存布局时开始随机崩溃)。
相关文章:
- 警告处理为错误这里有什么问题
- 当我选择大于 720 的矩阵大小时,程序退出并显示错误代码.可能是什么原因?
- 尝试使用 EvtSetChannelConfigProperty() 函数更新最大事件日志文件大小时插入的错误值
- 当 std 数组初始化太小时,C++会引发错误吗?
- 如何在c ++中调整数组大小时修复错误?
- 使用 Nvidia NPP 调整图像大小时未记录的大小调整错误
- 我在 36603 以上输入的任何数组大小时都会返回"堆栈溢出"错误。如何使字符串能够捕获整个.txt文件?
- 调整数组大小时出现内存错误
- 当整数变量用于在 c++ 中声明数组大小时,错误显示为"Expression must have a const value"
- 为什么此代码在使用可变数组大小时不会生成错误?
- Qt QQuickView视觉错误/调整大小时闪烁
- 增加数组大小时 CUDA 主体磁贴计算错误代码 77
- 调整矢量大小时出现运行时错误
- 重新调整优先级队列大小时出现双重释放或损坏错误
- 用ctime转换为char*时,std chrono 1小时错误
- 通过指定返回值的大小时出现质量错误
- 将time_t转换为字符串,而将字符串转换为time_t会给出错误的年份和小时
- 调整大小时出现Std::vector和内存错误
- 程序运行正常数小时,最终通过内存地址0x10出现 Seg 错误
- 使用SDL2调整无边框窗口大小时的错误