c++ - 构建另一个值
问题描述
我正在尝试在 C++ 中使用结构,但我遇到了一个问题:我有一个由名称和年龄组成的结构:
struct Professeur {
char* Name;
int Age;
Cours* ListeDeCours;
Etudiant* ListeDEtudiant;
Professeur* Suivant;
};
当我尝试输入名称时,它会起作用,并输入年龄时,它会起作用。但是如果我输入一个名字然后一个年龄,它会覆盖名字,见:
$ ./Doss
Prof.Nom before the Age : Prof1
Prof.Age : 2
Prof.Nom after the Age : 2
end 2
这是我的代码:
int i =0;
string temp;
Professeur prof;
while(i != 4){
if(i==0) {
if(getline(fichier,temp)){
prof.Nom = (char*) malloc(sizeof(char*));
prof.Nom = (char*) temp.c_str();
printf("Prof.Nom before the Age : %s\n",prof.Nom);
i++;
}
}
if(i==1){
if(getline(fichier,temp)){
prof.Ancien = atoi(temp.c_str());
printf("Prof.Age : %d\n",prof.Ancien);
printf("Prof.Nom after the Age : %s\n",prof.Nom);
i++;
}
}
printf("end %s \n",prof.Nom);
return prof;
}
我错过了什么?似乎这是一个指针问题,但我知道为什么。感谢您的关注
解决方案
prof.Nom = (char*) malloc(sizeof(char*));
为名称分配的内存不足(它只分配足够的字节来容纳指针)。然后您忽略它并将名称设置为指向带有prof.Nom = (char*) temp.c_str();
. 当您再次执行getline(fichier,temp)
时,指向原始字符串的指针(通过 获得.c_str()
)碰巧保持不变,这意味着 name 现在指向新获取的字符串(因为 name 仍然指向相同的临时字符串)。
要轻松修复,只需将 name 设为std::string
对象。
推荐阅读
- r - 为什么 head() 函数不适用于 Rmarkdown 中包含日期的数据帧
- ssh - ssh_vpn 或 sockes_proxy 设置网关?
- swift - ARSCNView 中的平滑对象旋转
- javascript - 点击事件不在循环中工作
- asynchronous - 在 Julia 中使用 @sync @async 的简单并行性
- phaser-framework - 如何在 Phaser 3 中使用本地字体?
- python - 查找和替换列表中彼此在一定范围内的数字
- scala - 查找不同数组列的大小
- arrays - 用部分填充 UITableView
- excel - 如果日期在表 1 上,则为表 1 中的列着色