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

C++中char转string后,26元素数组仅输出半数元素的问题求助

问题分析与修复

问题根源

你的代码中,for循环同时执行了i++和pAlphabet++,导致数组访问逻辑混乱:

  • 初始时pAlphabet指向数组首元素(索引0)
  • 第一次循环:i=0,pAlphabet[0]访问首元素,随后pAlphabet++指向索引1的元素
  • 第二次循环:i=1,此时pAlphabet已经指向索引1,pAlphabet[1]实际访问的是初始数组地址 + 1 + 1 = 索引2的元素
  • 以此类推,每次访问的位置是初始地址 + i + i,当i=13时,偏移量达到26,超出了数组的26个元素范围(索引0-25),后续访问属于越界操作,程序行为未定义,因此只能输出前13个字符。

修复方案

方案1:保留下标访问,移除指针自增

去掉循环中的pAlphabet++,让指针始终指向数组首地址,通过下标i正确访问每个元素:

#include <iostream>
using namespace std;

class Alphabet{
private:
    string name;

public:
    void setName(string name){
        this->name=name;
    }
    void speak(){
        cout << name << endl;
    }
};


int main() {

    Alphabet *pAlphabet = new Alphabet[26];
    char start = 'a';

    for(int i=0;i<26;i++,start++){
        string copy(1,start);
        pAlphabet[i].setName(copy);
        pAlphabet[i].speak();
    }

    // 释放动态分配的数组,避免内存泄漏
    delete[] pAlphabet;

    return 0;
}

方案2:用指针直接访问,使用临时指针移动

如果想用指针遍历数组,可以用一个临时指针代替原指针移动,保留原指针用于内存释放:

#include <iostream>
using namespace std;

class Alphabet{
private:
    string name;

public:
    void setName(string name){
        this->name=name;
    }
    void speak(){
        cout << name << endl;
    }
};


int main() {

    Alphabet *pAlphabet = new Alphabet[26];
    Alphabet *current = pAlphabet;
    char start = 'a';

    for(int i=0;i<26;i++,start++,current++){
        string copy(1,start);
        current->setName(copy);
        current->speak();
    }

    delete[] pAlphabet;

    return 0;
}

额外注意

使用new[]动态分配的数组,必须用delete[]对应释放,否则会造成内存泄漏。

内容的提问来源于stack exchange,提问作者Nigel Yeo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:45:54