2012-07-02 2 views
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 동일한 "집 ".

내 질문 : hName 설정

예상대로 내부는 역할을

, "집". 하지만 컨트롤이 함수 밖으로 전달되면 동적으로 할당 된 메모리가 할당 해제되므로 main에서 strcmp를 실행하면 프로그램이 중단되고 NULL 포인터를 비교하게됩니다.

+1

1. 그것은 해제 아닙니다. 2.하지 마십시오. –

+1

주어진 답변을 통해이 문제를 해결할 수 있지만이 작업을 수행해야하는 이유는 무엇입니까? C++에서'strcpy'를 사용하는 것은 대개 다른 스타일을 혼합하기 때문에 눈살을 찌푸리게됩니다. 'std : string's로 작업 해 보셨습니까? –

+1

코드가 충돌하는 이유를 이해하는 것이 중요하지만, C++ 문자열로 전환하여 문제가 발생하지 않도록하는 것이 좋습니다. – jlunavtgrad

답변

4

Nick, 적절한 해결책은 hName이 이미 클래스 사용자 (Dr. Coleman)에 의해 할당되었다는 것입니다. 문자 배열에 strcpy이 필요합니다.

은 간단히 말해 :

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

물론 쉽게 대답 할 수 있습니다. 다른 답변은 정확했지만, 특정 매개 변수 인 dr을 따르지 않았습니다. 콜맨이 준 .... 다시, 나는 지정하지 않았다. 몇 시간 후에 보자. – Nick

3

새 메모리를 할당하고 로컬 변수에 할당하고 있습니다. 주소가 함수에 전달 된 인수가 가리키는 변경됩니다

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

이 당신의 기능을 변경, 그것은 아닌 사본

+0

그러나 이것이 작동한다는 것을 이해합니다. 그러나 선생님은 자신의 메인을 사용하여 성적을 결정했기 때문에 클래스 함수의 이름 지정/정의시 매우 구체적인 요구 사항을 제공했습니다. 그는 우리에게 특별히 함수 프로토 타입을 사용하라고 말했습니다 (클래스 함수 인 경우에도 함수 호출이라고해도). getName (char * mName, char * wName); void, 그래서 포인터로 포인터를 만들 수 없습니다. – Nick

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); 
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을 사용하는 것입니다 : (210) 마찬가지로 집 변수에 대한 참조를 제공 할 수 있습니다.