3

学生.h

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

学生.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为“house”。但是当控制权从函数中传递出去时,我的动态分配的内存被释放了,所以当我在 main 中使用 strcmp 时,我的程序崩溃了(我最终比较了一个 NULL 指针)。

4

4 回答 4

4

尼克,正确的解决方案是您知道hName该类的用户(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);

同样,您可以引用 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 回答