C++数组变换与重排程序跨编译器随机值异常求助
C++数组处理程序在不同编译器下异常的问题解决
问题根源分析
- 非标准变长数组(VLA)引发未定义行为:C++标准不支持
int array[n];这种变长数组写法,这是C99特性。Clion默认的GCC在非严格模式下允许该写法,但VSCode使用的MSVC或严格模式GCC会触发未定义行为,表现为随机内存值。 - 重排数组逻辑完全错误:原代码从数组末尾向前交换0和非0元素,既无法将所有0移至末尾,还会打乱非零元素的原有顺序,完全不符合题目要求。
- 函数缺失返回值:
check_for_equality声明返回int但无return语句,触发未定义行为,不同编译器处理方式不同,可能导致随机值或崩溃。
修正后的代码
#include <iostream> #include <vector> using namespace std; // 变换数组:相邻相等元素翻倍,下一个设为0 void transformArray(vector<int>& arr) { int n = arr.size(); for (int i = 0; i < n - 1; ++i) { if (arr[i] == arr[i + 1]) { arr[i] *= 2; arr[i + 1] = 0; } } } // 重排数组:0移至末尾,保持非零元素原有顺序 void rearrangeArray(vector<int>& arr) { int n = arr.size(); int nonZeroPos = 0; // 收集所有非零元素到数组前部 for (int i = 0; i < n; ++i) { if (arr[i] != 0) { arr[nonZeroPos++] = arr[i]; } } // 填充剩余位置为0 while (nonZeroPos < n) { arr[nonZeroPos++] = 0; } } int main() { int n = 0; cin >> n; // 使用vector替代变长数组,符合C++标准 vector<int> arr(n); for (int i = 0; i < n; ++i) { cin >> arr[i]; } transformArray(arr); rearrangeArray(arr); // 输出结果,避免末尾多余空格 for (int i = 0; i < n; ++i) { if (i > 0) cout << " "; cout << arr[i]; } cout << endl; return 0; }
修正说明
- 用
vector<int>替代变长数组,解决跨编译器兼容性问题,完全符合C++标准。 - 拆分出
transformArray和rearrangeArray两个独立函数,满足题目“分别编写变换和重排函数”的要求。 - 重排逻辑改为“先收集非零元素,再填充0”,确保非零元素顺序不变,所有0移至末尾。
- 修正函数返回值问题,变换和重排函数改为
void类型,避免未定义行为。 - 优化输出格式,消除末尾多余空格。
内容的提问来源于stack exchange,提问作者opitimus
相关产品推荐
相关产品推荐

