指针给我的价值不一样

时间:2018-10-17 23:49:10

标签: c++ pointers

我正在学习如何用C ++编程,并且遇到了问题: 我有一个称为Professeur的结构,其中Cours和Etudiant是其他结构(这里不是问题):

struct Professeur {
        std::string Nom;
        int Ancien;
        Cours* ListeDeCours;
        Etudiant* ListeDEtudiant;
        Professeur* Suivant;
      };

在我的程序中,我读取了一个文件,然后将数据存储在这些结构中。但是,当我想显示存储在“ Suivant” Professeur中的信息时,我遇到了问题,请参阅:

数据文件:

Prof1
1
Cours11
Cours12
Cours13
&
Etudiant11
Etudiant12
Etudiant13
$
Prof2
2
Cours21
Cours22
Cours23
&
Etudiant21
Etudiant22
Etudiant23
$

输出:

2
1
1
6304032

如您所见,newprof-> Ancien没有给我相同的值,我也不知道为什么我不修改它(我想)。所以我做了一个测试程序,在这里我自己创建了结构,并且效果很好:

我搜索了所有内容,但我不知道为什么它不起作用。有人可以看一下吗?非常感谢

这是应该定位问题的代码: test.cpp

ifstream fichier;
vector<DossierProfesseur::Professeur> ContainerProf;
vector<DossierProfesseur::Cours> ContainerCours;
vector<DossierProfesseur::Etudiant> ContainerEtudiant;
DossierProfesseur::DossierProfesseur(string FP){
    fichier.open(FP);
    if (fichier.is_open() ){
        Professeur premier = DossierProfesseur::CreationListeProfesseur();
        tete = &premier;
        Professeur *newprof = DossierProfesseur::getNextProf(tete);

        cout<< newprof->Ancien<<"\n";
        cout<< tete->Ancien<<"\n";
        cout<< tete->Ancien<<"\n";
        cout<< newprof->Ancien<<"\n";
    }
    else{
        printf("Error while openning file");
    }
}

DossierProfesseur::Professeur* DossierProfesseur::getNextProf(DossierProfesseur::Professeur* prof){
    return prof->Suivant;
}


DossierProfesseur::Professeur DossierProfesseur::CreationListeProfesseur(){
    Professeur prof;
    Cours cours;
    Etudiant etudiant;
    if(!fichier.eof()){ //Fin du fichier
        getline(fichier,prof.Nom);
        string ancien;
        getline(fichier,ancien);
        prof.Ancien = stoi(ancien);
        Professeur nextProf = DossierProfesseur::CreationListeProfesseur();
        prof.Suivant = &nextProf;
    }
    else{
        prof.Nom = string();
        prof.Ancien = 0;
        prof.ListeDeCours = NULL;
        prof.ListeDEtudiant = NULL;
        prof.Suivant = NULL;
    }
    ContainerProf.push_back(prof);
return ContainerProf.back();
}

int main()
{
    string dest = "FP.txt";
    DossierProfesseur dos (dest);
    return 0;
}

test.h:

#ifndef DossierProfesseur_h
#define DossierProfesseur_h
#include <iostream>
#include <fstream>
#include <cstring>
#include <stdlib.h>

  class DossierProfesseur
  {
    public:
      DossierProfesseur(std::string FP);

      struct Cours{
        std::string Sigle;
        Cours* Suivant;
      };
      struct Etudiant{
        std::string Sigle;
        Etudiant* suivant;
      };
      struct Professeur {
        std::string Nom;
        int Ancien;
        Cours* ListeDeCours;
        Etudiant* ListeDEtudiant;
        Professeur* Suivant;
      };
      Professeur CreationListeProfesseur();
      Professeur *getNextProf(Professeur *prof);
      Professeur* tete;
    private:


  };
#endif

编辑: 使用向量,我的输出与以前相同:

2 - 0x7ffe26c10520
1
1
6320480 - 0x7ffe26c10520

它们指向相同的地址,但具有不同的值 要使用向量,我使用了以下方法: 向量ContainerProf;作为全局变量 然后在CreationListeEtudiant中: 受过教授的邀请,我返回了这个:

ContainerProf.push_back(prof);
    return ContainerProf.back();

我做错了吗?

1 个答案:

答案 0 :(得分:1)

DossierProfesseur::Professeur DossierProfesseur::CreationListeProfesseur(){
    Professeur prof;
    Cours cours;
 ...
        cours = DossierProfesseur::CreationListeCours();
        prof.ListeDeCours = &cours;
        etudiant = DossierProfesseur:
 ...
    return prof;
}

您在此函数内将cours创建为本地对象,因此当该函数返回时,cours将不复存在。但是,您将cours的地址存放在按值返回的prof对象中。因此,您要向调用者返回一个对象,该对象包含指向不再存在的对象的指针。试图取消对该指针的引用是灾难性的。

请不要以这种方式使用指针。这使得管理对象的生存期极为困难。