2012-07-02 14 views
3

Student.h傳遞字符指針到一個函數,動態地分配存儲器

class Student 
{ 
private: 
     char m_sHouse[64]; 
public: 
Student(void); 
~Student(void); 
void getHouse(char *hName); 
void setHouse(char *hName); 
} 

Student.cpp

void Student::setHouse(char *hName) 
{ 
    strcpy(m_sHouse, hName); 
} 

void Student::getHouse(char *hName) 
{ 
    if (m_sHouse != NULL) 
    { 
     hName = new char[strlen(m_sHouse)+1]; 
     strcpy(hName, m_sHouse); 
    } 
} 

在主:

student.getHouse(house); 
if (strcmp(house, "house") == 0) 
    cout <<"\tCorrectly returned the student house: " << house<< endl; 

setHouse(char *hName)student->m_sHouse等於「房子」。

我的問題:

當內部,它的作用,因爲它應該設置hName到 「家」。但是當控制傳遞給函數時,我的動態分配的內存被釋放,所以當我strcmp在主,我的程序崩潰(我最終比較NULL指針)。

+1

1.它不釋放。 2.不要這樣做。 –

+1

給出的答案將解決這個問題,但我可以問你爲什麼需要這樣做嗎?因爲你在混合不同的風格,所以在C++中使用'strcpy'通常是不被讚賞的。你有沒有嘗試過使用'std:string's? –

+1

雖然瞭解代碼崩潰的原因非常重要,但最好切換到C++字符串以完全避免此問題。 – jlunavtgrad

回答

4

尼克,正確的解決方案是,你知道hName已經由班級的用戶(科爾曼博士)分配。你只需要strcpy到字符數組中。

簡單地說:

void Student::getHouse(char *hName) 
{ 
    strcpy(hName, m_sHouse); 
} 
+0

當然它的簡單答案....欣賞它的隊友。其他答案是正確的,只是沒有遵循博士的具體參數。科爾曼又給了......然後,我沒有說明。幾個小時後見。 – Nick

3

您正在分配新內存並將其分配給本地變量。更改功能

void Student::getHouse(char **hName) 
{ 
    if (m_sHouse != NULL) 
    { 
     *hName = new char[strlen(m_sHouse)+1]; 
     strcpy(*hName, m_sHouse); 
    } 
} 

這將改變地址在傳遞給函數的參數指出,不是它的拷貝

+0

我知道這會起作用,但是,當命名/定義類功能時,我的老師給了我們非常具體的要求,因爲他使用他自己的主類來進行評分。他告訴我們要專門使用函數原型(如果那就是你稱之爲類函數時),void getName(char * mName,char * wName);'所以,我不能做一個指針指針。 – Nick

1
void Student::getHouse(char *hName) 
{ 
    if (m_sHouse != NULL) 
    { 
     hName = new char[strlen(m_sHouse)+1]; 
     strcpy(hName, m_sHouse); 
    } 
} 

這只是修改hName指針的副本,不修改原始指針。要修改它,你需要一個指針傳遞給您的指針:

void Student::getHouse(char **hName) 
{ 
    if (m_sHouse != NULL) 
    { 
     *hName = new char[strlen(m_sHouse)+1]; 
     strcpy(*hName, m_sHouse); 
    } 
} 

,並調用你的函數是這樣的:

student.getHouse(&house); 
2

指針hname副本house(你通過指針到getHouse)。在那個函數裏面你改變hname,然而,你是而不是改變了原來的house!要做到這一點,你要麼返回所分配的內存:

char *Student::getHouse() 
{ 
    char *hame = NULL; 
    if (m_sHouse != NULL) 
    { 
     hName = new char[strlen(m_sHouse)+1]; 
     strcpy(hName, m_sHouse); 
    } 
    return hname; 
} 

然後

house = student.getHouse(); 

或給一個指針這個變量,以便它可以被改變:

void Student::getHouse(char **hName) 
{ 
    if (m_sHouse != NULL && hname != NULL) 
    { 
     *hName = new char[strlen(m_sHouse)+1]; 
     strcpy(*hName, m_sHouse); 
    } 
} 

然後

student.getHouse(&house); 

同樣,你可以給房子變量的引用:

void Student::getHouse(char *&hName) 
{ 
    if (m_sHouse != NULL) 
    { 
     hName = new char[strlen(m_sHouse)+1]; 
     strcpy(hName, m_sHouse); 
    } 
} 

然後

student.getHouse(house); 

更好的解決方案然而,是使用std::string代替。