C++读取文本行存入char**字符串数组时重复输出最后一行问题
问题根因
所有行输出重复最后一行的核心错误是没有做字符串内容拷贝,仅将数组指针指向了临时字符串的内部地址:
- 构造函数里你确实提前为100行文本各分配了200字节的存储内存,但读取循环里的
readBuffer[i] = (char*)tmpString.c_str();操作直接覆盖了readBuffer[i]原本指向已分配内存的指针,既造成了内存泄漏,也让所有数组成员都指向了同一个地址——也就是std::string类型成员tmpString的内部字符存储区。 getline每次读取新行时,只会覆盖tmpString内部存储的内容,不会改变它的内存起始地址。等整个读取循环结束,tmpString里存的就是文件最后一行的内容,此时所有readBuffer的指针都指向这块存着最后一行内容的内存,打印自然全是重复的最后一行。- 代码另外还有两个隐藏问题:一是文件打开失败的分支没有写返回值,属于未定义行为;二是打印循环用了
i <= 5的边界,会访问下标为5的无效内存,容易触发乱码或崩溃。
修复方法
不要直接修改readBuffer[i]的指针指向,而是将读取到的字符串内容拷贝到提前分配好的内存中,修改后的读取逻辑参考:
// 提前引入字符串拷贝函数需要的头文件 #include <cstring> char** FileReader::ReadFile(const char* filename) { int i = 0; File.open(filename); if (File.is_open()) { while (getline(File, tmpString)) { // 用strncpy限制拷贝长度,避免单行太长超过200字节的分配上限造成溢出 strncpy(readBuffer[i], tmpString.c_str(), 199); // 手动补字符串结束符 readBuffer[i][199] = '\0'; i++; // 加边界判断,防止行数超过提前分配的100行上限造成数组越界 if (i >= 100) { break; } } // 读取完成后记得关闭文件句柄 File.close(); return readBuffer; } // 文件打开失败时返回空指针,避免未定义行为 return nullptr; }
打印时调整循环边界,5行内容对应下标0到4,不要越界访问:
for (int i = 0; i < 5; i++) { cout << fileCpy[i] << endl; }
提示:纯C++场景下更推荐直接用
std::vector<std::string>存储读取到的行内容,不需要手动管理内存分配释放,从根源上避免指针指向错误、内存泄漏、缓冲区溢出这类问题。
内容的提问来源于stack exchange,提问作者SNO。
相关产品推荐
相关产品推荐

