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
相关产品推荐
相关产品推荐

