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指针)。
答案 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);