首页 > 解决方案 > 构建另一个值

问题描述

我正在尝试在 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;
    }

我错过了什么?似乎这是一个指针问题,但我知道为什么。感谢您的关注

标签: c++

解决方案


prof.Nom = (char*) malloc(sizeof(char*));为名称分配的内存不足(它只分配足够的字节来容纳指针)。然后您忽略它并将名称设置为指向带有prof.Nom = (char*) temp.c_str();. 当您再次执行getline(fichier,temp)时,指向原始字符串的指针(通过 获得.c_str())碰巧保持不变,这意味着 name 现在指向新获取的字符串(因为 name 仍然指向相同的临时字符串)。

要轻松修复,只需将 name 设为std::string对象。


推荐阅读