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
相关产品推荐
相关产品推荐

