我正在尝试在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;
}
我想念什么?似乎是指针问题,但idk为什么。 感谢您的关注
答案 0 :(得分:4)
prof.Nom = (char*) malloc(sizeof(char*));
为该名称分配了不足的内存(它仅分配了足够的字节以适合指针)。然后,您可以忽略它,并使用prof.Nom = (char*) temp.c_str();
将名称设置为指向临时字符串。当您再次执行getline(fichier,temp)
时,指向原始字符串(用.c_str()
获得)的指针碰巧保持不变,这意味着该名称现在指向新获取的字符串(因为名称仍然指向相同的字符串)临时字符串)。
要轻松修复,只需将其命名为std::string
对象即可。
答案 1 :(得分:1)
这就是问题所在:
prof.Nom = (char*) malloc(sizeof(char*));
prof.Nom = (char*) temp.c_str();
所以我们需要的是:
prof.Nom = (char *)malloc(sizeof(char) * (temp.size() + 1));
strcpy(prof.Nom, temp.c_str());
实际上,最好使用“字符串”而不是“字符”。如果您真的想在结构中使用它,请使用“ char [MAX_LEN]”而不是“ char *”,这是因为令人讨厌的“ malloc”和“ free”。