将字符指针传递给函数并动态分配内存

时间:2012-07-02 18:40:48

标签: c++ class pointers dynamic-allocation

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等于“house”。

我的问题:

当在getHouse(char *hName)内时,它会按预期运行,将hName设置为“住宅”。但是当控制权从函数中传出时,我的动态分配的内存被释放,所以当我在main中strcmp时,我的程序崩溃了(我最终比较了一个NULL指针)。

4 个答案:

答案 0 :(得分:4)

尼克,正确的解决方案是你知道hName已经由班级用户(科尔曼博士)分配。您只需要strcpy进入字符数组。

简单地说:

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

答案 1 :(得分:3)

您正在分配新内存并将其分配给本地变量。将您的功能更改为

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

这将更改传入函数的参数所指向的地址,而不是其副本

答案 2 :(得分: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代替。

答案 3 :(得分: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);