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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 19:55:22