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「家」に等しいセット。

私の質問:

中に入ると、 「家」getHouse(char *hName)に設定して、本来の動作をします。hNameしかし、制御が関数から渡されると、動的に割り当てられたメモリの割り当てが解除されるため、mainでstrcmpを実行すると、プログラムがクラッシュします(NULLポインターを比較することになります)。

4

4 に答える 4

4

ニック、適切な解決策はhName、クラスのユーザー(Dr. Coleman)によってすでに割り当てられていることを知っていることです。あなたは単にstrcpy文字配列に入る必要があります。

簡単に言えば:

void Student::getHouse(char *hName)
{
  strcpy(hName, m_sHouse);
}
于 2012-07-02T19:23:26.573 に答える
3

新しいメモリを割り当てて、それをローカル変数に割り当てています。関数をに変更します

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

これにより、関数のコピーではなく、関数に渡された引数が指すアドレスが変更されます。

于 2012-07-02T18:43:46.070 に答える
2

ポインタhnameは(に渡したポインタ)のコピーです。その関数内で変更しますが、元の関数は変更しませ。これを行うには、割り当てられたメモリを返す必要があります。housegetHousehnamehouse

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代わりに使用することです。

于 2012-07-02T18:45:47.230 に答える
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);
于 2012-07-02T18:43:55.693 に答える