2015-08-08 81 views
0

我有一個奇怪的問題。我有一個練習練習指針,結果會根據cout語句的順序而有所不同。根據我首先想到的兩個結構變量,它們會以不同的方式出現。更具體地說,struct Student有兩個變量,名稱和gpa。設置變量後,如果我cout gpa然後名稱,gpa是好的,名稱不是;如果我的名字是gpa,名字很好,而gpa不是。任何想法爲什麼?cout結構中變量的cout順序改變內容?

這是代碼,有名字,那麼GPA輸出:

#include <iostream> 
#include <iomanip> 
using namespace std; 

struct Student 
{ 
    char * name; 
    float gpa; 
}; 

Student *createStudent(char name[], float gpa); 

int main() 
{ 
    int  MAX = 100; 
    float stuGpa = 0; 
    char *stuName = new char[MAX]; 

    cout << fixed << setprecision(2); 

    stuName = "fubar"; 
    stuGpa = 4.0; 

    Student *student1; 
    student1 = new Student; 
    student1 = createStudent(stuName, stuGpa); 

    // cout name (first) 
    cout << "\nStudent name is " << student1->name; 

    // cout gpa (second) 
    cout << "\nStudent gpa is " << student1->gpa; 

    return 0; 
} 

Student *createStudent(char name[], float gpa) 
{ 
    int length = strlen(name); 
    Student newStudent; 
    newStudent.gpa = gpa; 
    newStudent.name = new char[length]; 
    newStudent.name = name; 
    return &newStudent; //return the address of the newly created student 
} 

我的輸出:

Student name is fubar 
Student gpa is 0.00 

如果我扭轉COUT語句,輸出爲

Student gpa is 4.00 
Student name is 

任何想法爲什麼cout順序影響結構變量的內容?

+1

你應該確實閱讀[編譯器警告](http://melpon.org/wandbox/permlink/mFk7JIrfAqvNwBYc) –

回答

3

是的,你是返回一個局部變量的地址:

Student *createStudent(char name[], float gpa) 
{ 
    Student newStudent; // <-------- here 
    return &newStudent; //return the address of the newly created student 
} 

新成立的學生只活,只要createStudent功能被執行。當達到}時,它被破壞。您返回了一個指向不存在的對象的指針。

您也可以在主函數中的內存泄漏:

student1 = new Student; // point "student1" to a newly allocated Student 
student1 = createStudent(stuName, stuGpa); // point it elsewhere 

通過創建的對象的「新」不再有任何指向它,因爲你做「student1」點別處。

還有另一種這樣的泄漏:

stuName = new char[MAX]; // point stuName at some allocated memory 
stuName = "fubar";   // point stuName at "fubar" instead 

這是哪門子亂你的使用指針和new時進入。

要解決這個爛攤子你最好的選擇是做如下修改:

  • 返回Student,不Student *
  • 使用Student,不Student *在主函數
  • 變化char * namestd::string name
  • 更改char *stuName = new char[MAX];std::string stuName;
+0

感謝您指出我的noob錯誤與createStudent中的student1的本地實例。不幸的是,我無法擺脫指針,因爲它們是任務的一部分(我真的更喜歡使用字符串,所以我很樂意接受你的建議),所以我將學生初始化移動到main並添加了一個參數createStudent將Student指針傳遞給它。 –

+0

好的解決方案 –