过度构造另一个价值

时间:2018-10-16 03:05:18

标签: 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;
    }

我想念什么?似乎是指针问题,但idk为什么。 感谢您的关注

2 个答案:

答案 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();
  1. sizeof(char *)是指针大小,而不是char大小,实际大小取决于“ getline(fichier,temp)”。
  2. 您应该使用memcpy或strcpy将值复制到内存空间。(不仅分配引用,这就是为什么出现“年龄后2:Prof.Nom”,而'Prof.Nom'始终为' temp')。

所以我们需要的是:

prof.Nom = (char *)malloc(sizeof(char) * (temp.size() + 1));
strcpy(prof.Nom, temp.c_str());

实际上,最好使用“字符串”而不是“字符”。如果您真的想在结构中使用它,请使用“ char [MAX_LEN]”而不是“ char *”,这是因为令人讨厌的“ malloc”和“ free”。