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

C++动态数组二次调用modifyArray函数未正确修改问题求助

问题分析与解决方案

核心问题

你的代码出现预期不符的原因有两个:

  • 参数传递错误:modifyArray函数的FarraySize是传值传递,函数内部修改的只是参数的副本,main函数里的arraySize完全没被更新。第二次调用函数时,还是用初始的数组长度4来处理,最后循环输出的也是这个未更新的长度,自然看不到新增的元素。
  • 内存泄漏隐患:函数里的临时数组subPlaylist用完后没有释放,会导致内存泄漏。

修改后的完整代码

#include <iostream>
#include <string>
#include <algorithm> // std::copy 需要的头文件

using namespace std;

void modifyArray(string*&, int&);

int main()
{
    int arraySize = 4;
    string* playlist = new string[arraySize];
    playlist[0] = "aaaa";
    playlist[1] = "bbbb";
    playlist[2] = "cccc";
    playlist[3] = "dddd";
    
    modifyArray(playlist, arraySize);
    modifyArray(playlist, arraySize);
    
    for (int i = 0; i < arraySize; i++)
    {
        cout << playlist[i] << endl;
    }
    
    delete[] playlist; // 释放主数组内存,避免泄漏
}

void modifyArray(string*& Fplaylist, int& FarraySize)
{
    string* subPlaylist = new string[FarraySize];
    copy(Fplaylist, Fplaylist + FarraySize, subPlaylist);

    delete[] Fplaylist;
    FarraySize += 1; // 直接修改main函数中的arraySize变量
    Fplaylist = new string[FarraySize];
    copy(subPlaylist, subPlaylist + FarraySize - 1, Fplaylist);
    Fplaylist[FarraySize - 1] = "eeee";
    
    delete[] subPlaylist; // 释放临时数组内存
}

关键修改说明

  1. 数组长度参数改为传引用:将int FarraySize改为int& FarraySize,这样函数内部对长度的修改会直接同步到main函数的arraySize,第二次调用时就能基于更新后的数组长度处理。
  2. 清理临时内存:添加delete[] subPlaylist;和delete[] playlist;,避免动态分配的内存泄漏。
  3. 补充必要头文件:std::copy算法需要依赖<algorithm>头文件,否则可能编译报错。

运行结果

修改后程序会输出预期内容:

aaaa
bbbb
cccc
dddd
eeee
eeee

内容的提问来源于stack exchange,提问作者Ahmed Salah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:25:43