【问题标题】:Passing character pointers into a function and dynamically allocating memory将字符指针传递给函数并动态分配内存
【发布时间】:2012-07-03 04:49:25
【问题描述】:

学生.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-&gt;m_sHouse 等于“房子”。

我的问题:

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

【问题讨论】:

  • 1.它没有被释放。 2. 不要这样做。
  • 给出的答案将解决这个问题,但我可以问你为什么需要这样做?在 C++ 中使用 strcpy 通常是不受欢迎的,因为你混合了不同的风格。您是否尝试过与std:strings 合作?
  • 虽然了解代码崩溃的原因对您很重要,但最好切换到 C++ 字符串以完全避免该问题。
  • 我需要这样做,因为我的老师已经老了。他知道使用字符串是可行的方法,但在他看来,我们可能不得不使用旧代码,或者老程序员卡在他们的方式中,所以他希望我们习惯使用 kernigan 和 ritchie 字符数组。
  • 我看到有人在完成 Coleman 博士的任务。

标签: c++ class pointers dynamic-allocation


【解决方案1】:

Nick,正确的解决方案是您知道hName 已由该类的用户(Coleman 博士)分配。您只需要将strcpy 放入字符数组中。

简单地说:

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

【讨论】:

  • 当然它的简单答案....欣赏它的伙伴。其他答案是正确的,只是没有遵循博士的具体参数。科尔曼给了....然后,我没有具体说明。几小时后见。
【解决方案2】:

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

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

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

【讨论】:

  • 我知道这会起作用,但是,我的老师在命名/定义类函数时对我们提出了非常具体的要求,因为他使用自己的 main 评分。他告诉我们要专门使用函数原型(如果那是你在类函数时调用它们的话)void getName(char *mName, char *wName); 所以,我不能创建指向指针的指针。
【解决方案3】:

指针hnamehouse(您传递给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);

同样,你可以给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

【讨论】:

    【解决方案4】:
    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);
    

    【讨论】:

      猜你喜欢
      • 2014-06-03
      • 2016-02-09
      • 2014-06-19
      • 1970-01-01
      • 2013-06-07
      • 2018-07-31
      • 2020-10-30
      • 1970-01-01
      • 2015-09-12
      相关资源
      最近更新 更多