C++可变长度数组在同事环境可运行 本地IDE报错要求数组长度为常量
差异原因
- 你代码中
int a[size];的写法属于变长数组(VLA),是C99标准的特性,并不属于任何版本的官方C++标准。 - 你同事的开发环境使用的是支持GNU扩展的编译器(如GCC),且编译参数开启了非标准扩展兼容,所以可以正常编译运行;你本地的IDE使用了严格遵循C++标准的编译配置,或是使用了MSVC等本身不支持变长数组扩展的编译器,因此会直接报错要求数组长度为常量。
- 额外注意:你原代码中数组填充的循环写的是
for (i = 0; i <= size; i++),会发生数组下标越界,合法的数组下标范围是0 ~ size-1,就算编译器支持VLA,这段代码也会触发内存访问异常。
解决方案
最推荐使用C标准库提供的std::vector实现动态长度数组,完全符合C标准,所有编译器都支持,无需依赖非标准扩展,修改后的代码如下:
#include <iostream> #include <vector> // 引入vector头文件 using namespace std; int main() { int i, x, j, t; int size = rand() % 100;//random number vector<int> a(size); // 用vector替代原生数组,支持动态指定长度 //array filling,修正越界问题 for (i = 0; i < size; i++) { a[i] = rand() % 100; } for (x = 0; x < size; x++) { for (j = x + 1; j < size; j++) { if (a[j] < a[x]) { t = a[x]; a[x] = a[j]; a[j] = t; } } } for (x = 0; x < size; x++) { cout << a[x] << "\t"; } return 0; }
如果不想用vector,也可以手动动态分配内存:
int* a = new int[size]; // 中间代码逻辑不变 // 程序结束前手动释放内存 delete[] a;
如果仅需要临时对齐同事的编译环境,可修改编译器参数开启GNU扩展(如GCC添加编译参数-std=gnu++17),但该方案会导致代码丧失跨编译器兼容性,不推荐长期使用。
内容的提问来源于stack exchange,提问作者Khaled Ashour
相关产品推荐
相关产品推荐

