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

动态内存分配结合数组与指针打印失败问题求助

问题分析与解决:动态内存分配下打印字符数组崩溃问题

看起来你遇到的是典型的未初始化野指针导致的内存访问错误——当你同时使用ph和nm这两个未赋值的指针时,程序会访问非法内存区域直接崩溃;而注释其中一个时,只是侥幸没触发这个非法访问(或者编译器/运行时的偶然情况让程序“暂时”跑起来了,但这完全不可靠)。

先看你代码里的核心问题点:

char *ph, *nm;  // 只声明了指针,但没有分配内存或指向合法地址

核心问题:野指针的危害

你声明了char *ph和char *nm,但这两个指针属于野指针——它们指向内存中的随机未知地址。当你尝试往这些地址写入数据、或者直接打印它们时,会触发内存访问违规(Segmentation Fault),直接导致程序终止。

两种可靠解决方案

方案1:给char*动态分配合法内存

在使用指针之前,先根据字符串的预期长度分配内存,用完后记得释放避免内存泄漏:

// 假设名字/手机号最多50个字符(包含末尾的\0)
ph = new char[50];
nm = new char[50];

// 用完后释放内存
delete[] ph;
delete[] nm;

方案2:用std::string替代char*(更推荐)

C++里处理字符串优先用std::string,它会自动管理内存,不用手动分配释放,安全性拉满:

#include <string>  // 需要添加这个头文件
// 替换char*为string类型
string ph, nm;

之后直接用cin >> ph或getline(cin, ph)读写都不会有内存问题。

修复后的完整示例代码(用std::string版本)

#include <iostream>
#include <string>  // 添加string头文件
#include "ContactInfo.h"
using namespace std;

int main() {
    int n = 0;
    string ph, nm;
    ContactInfo *allcontacts;

    cout << "How many people you want to add to phone book? ";
    cin >> n;
    cin.ignore();  // 清除cin留下的换行符,避免后续getline读空

    allcontacts = new ContactInfo[n];
    for (int i=0; i < n; i++) {
        cout << i + 1 << ". Enter name: ";
        getline(cin, nm);
        cout << i + 1 << ". Enter phone number: ";
        getline(cin, ph);
        
        // 假设ContactInfo有对应构造函数或set方法
        allcontacts[i] = ContactInfo(nm, ph);
        // 正常打印测试
        cout << "Added: Name - " << nm << ", Phone - " << ph << endl;
    }

    // 释放动态分配的ContactInfo数组
    delete[] allcontacts;
    return 0;
}

额外注意事项

  1. 如果坚持用char*,一定要确保分配的内存足够容纳输入的字符串(包括末尾的\0),否则会出现缓冲区溢出,同样会崩溃。
  2. 动态分配的内存必须配对释放:用new[]分配的数组,必须用delete[]释放,避免内存泄漏。
  3. 使用cin >> n后,输入缓冲区会残留换行符,直接用getline会读到空字符串,所以需要用cin.ignore()清除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:14:53