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

C++结构体char*成员赋值后打印输出随机字符问题求助

问题根因排查
  • 核心错误1:prsn结构体中的name成员是char*类型,声明p1变量后没有为name指针分配有效的可写内存,直接对p1.name[n]赋值属于非法访问野指针指向的内存,属于C++未定义行为,是输出随机字符的主要原因。
  • 核心错误2:即便给name分配了内存,当前代码仅写入了6个字符Aditya,没有在末尾追加C风格字符串要求的结束符\0,cout输出char*时会持续读内存直到遇到\0,也会导致输出多余的随机内容。
  • 额外问题:将Gender枚举值赋值给bool类型的gender成员,输出时只会打印0/1,无法输出男女文本,不符合功能预期。
修复方案

有两种常用修复方式:

方案1:C风格字符串修复

手动为name分配内存并补充结束符:

#include <iostream>
using namespace std;

// 枚举定义要放在结构体前面,否则结构体无法识别Gender类型
enum Gender
{
    male,
    female
};

typedef struct person
{
    int age;
    char* name;
    float salary;
    Gender gender; // 将类型改为枚举Gender,不要用bool
} prsn;

int main()
{
    prsn p1;
    // 给name分配7个char的内存:6个有效字符+1个结束符位
    p1.name = new char[7];
    p1.name[0] = 'A';
    p1.name[1] = 'd';
    p1.name[2] = 'i';
    p1.name[3] = 't';
    p1.name[4] = 'y';
    p1.name[5] = 'a';
    p1.name[6] = '\0'; // 追加字符串结束符
    p1.age = 17;
    p1.salary = 100000;
    p1.gender = male; 

    cout << "Person p1's info:\nName: " << p1.name << "\nAge: " << p1.age << "\nSalary: " <<
    p1.salary << "\nGender: " << (p1.gender == male ? "男" : "女");
    // 释放堆内存避免泄漏
    delete[] p1.name;
    return 0;
}

方案2:使用C++标准库std::string(更推荐)

无需手动管理内存和结束符,代码更安全简洁:

#include <iostream>
#include <string> // 引入string头文件
using namespace std;

enum Gender
{
    male,
    female
};

typedef struct person
{
    int age;
    string name; // 替换char*为std::string
    float salary;
    Gender gender;
} prsn;

int main()
{
    prsn p1;
    p1.name = "Aditya"; // 直接赋值即可,标准库自动处理内存和结束符
    p1.age = 17;
    p1.salary = 100000;
    p1.gender = male; 

    cout << "Person p1's info:\nName: " << p1.name << "\nAge: " << p1.age << "\nSalary: " <<
    p1.salary << "\nGender: " << (p1.gender == male ? "男" : "女");
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:45:02