You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 02:25:33