C++程序初始化char*数组时第3次循环崩溃,求原因分析
问题原因分析
核心问题:未为字符串分配有效内存
你代码里的char** ArrChar = new char*[N];仅仅是在堆上创建了一个能存放N个char*指针的数组,但数组里的每个char*都是未初始化的野指针——它们指向的是随机的、无权限访问的内存地址。当你调用cin.getline(ArrChar[i], 40)时,程序会尝试往这些随机地址写入字符串数据,这直接触发了内存访问越界,导致程序崩溃。
所谓“初始化2个字符串时运行正常”只是巧合:野指针刚好指向了一块暂时可被写入的内存区域,但这属于未定义行为,程序随时可能崩溃,完全不可靠。
固定大小数组崩溃的原因
哪怕换成固定大小的char* ArrChar[3];,本质问题依然存在:数组里的每个char*还是野指针,没有指向合法的内存空间,所以输入第一个字符串时就会触发内存错误。
修复方案
方案1:手动为每个字符串分配内存
在循环输入字符串前,先为每个char*指针分配足够的内存(比如40字节),确保cin.getline有合法的写入区域:
for (int i=0; i<N; i++) { ArrChar[i] = new char[40]; // 为当前字符串分配40字节内存 cout << "Input string #" << i+1 << ": "; cin.getline(ArrChar[i], 40); }
注意:最后要先逐个释放每个字符串的内存,再释放指针数组,避免内存泄漏:
// 释放每个字符串的内存 for (int i=0; i<N; i++) { delete[] ArrChar[i]; } // 释放指针数组 delete[] ArrChar;
方案2:使用C++标准库简化内存管理(推荐)
直接用std::string和std::vector代替手动管理字符指针,完全避免野指针和内存泄漏问题:
#include <vector> #include <string> // 替换原char**相关代码 cout << "Input number of strings, that you plan to input: "; cin >> N; cin.get(); std::vector<std::string> strs(N); for (int i=0; i<N; i++) { cout << "Input string #" << i+1 << ": "; getline(cin, strs[i]); } // 简化maxn逻辑,直接找最长字符串 std::string longest = strs[0]; for (const auto& s : strs) { if (s.size() > longest.size()) { longest = s; } } cout << "The longest string is: " << longest << '\n';
内容的提问来源于stack exchange,提问作者Stas Furmavnin
相关产品推荐
相关产品推荐

