2013-01-31 3 views
-2

을 변경할 수 없습니다 :나는 다음과 같은 몇 가지 기능이 문자 포인터 (배열)

void MClass::GetS(char* buf, int max) const { 
char *temp = new char[max]; 
temp[max] = '\0'; 
for (int i = 0; i < max - 1; i++) 
    temp[i] = src[i]; // src is class member (char *) 
buf = temp; // buf is null after this o.O 
} 

그래서,이 기능에 버피 값을 변경할 수 없습니다. 왜 그것이 일어나는가?

+2

정의되지 않은 동작입니다. – chris

+2

코드가 메모리 누수 btw –

+0

왜 발생합니까? – 0x499602D2

답변

0

문제 :

  1. temp[max] = '\0';으로 힙 배열의 끝을 쓰고 있습니다. 버퍼의 0 1 지점을 차지합니다.

  2. 큰 src가 누구인지 아는 사람. 당신은 "max"를 전달하고 체크없이 src에 대해 읽는 중입니다. 크기 - 매우 위험합니다.

  3. 포인터가있는 포인터를 반환하고 있습니다. 당신은 이중 포인터를 전달하고 실제 포인터 값이 제대로 반환받을 필요가 (또는 return 문에 포인터를 반환한다.)

의심, 디버거에서 코드를 추적. 내 생각 엔 컴파일러가 마지막 임무를 멀리두고 당신에게 NULL로 남겨 두었다 - 나중에 당신이 지금 손상된 힙과 메모리 누수로 나중에 명랑하게 추락하게하는 것입니다.

0

UB/오류 따라서 MAX 요소와 인덱스 시작 및 0을 가지므로 배열 이외의 요소를 참조합니다. 문자 배열에는 항상 null 문자 btw에 1 개의 추가 문자가 필요합니다.

src에 대한 자세한 정보도 도움이 될 것입니다.

하지만 전달 된 값을 변경/반환하지 않는 동안이 경우에 당신이 (매개 변수)를 버피의 값을 변경하는 솔기

.

당신은 포인터 포인터 또는 참조에 대한 포인터를 전달해야 (* ) 또는 ( &)를 사용하는 것이 좋습니다.

+0

나는 그것을 알고 있지만, 내 함수는 주어진 널 널 C 스타일의 문자열 버퍼로 문자열을 복사해야한다. 따라서 발신자가 null을 보내면 동작이 정의되지 않음 – m0stwanted

+0

내 대답 –

2

함수에 char *을 전달하면 해당 함수에 대한 포인터의 복사본이 전달됩니다. 값으로 전달되는 포인터라고 생각할 수 있습니다. 이 복사 된 포인터를 수정해도 원래 포인터는 변경되지 않습니다. 당신은 참조를 전달해야

(포인터 참조) :

void MClass::GetS(char *&buf, int max) const 

또는 포인터 (포인터 포인터) :

void MClass::GetS(char **buf, int max) const 

또는 포인터 반환 :

char *MClass::GetS(int max) const 
+0

예,이 모든 것을 이해합니다. 하지만 왜 함수에서 buf 변수를 변경할 수 없습니까? 예를 들어 다음과 같은 코드를 작성하면 : buf = new char 또는 다른 포인터가 null입니다. – m0stwanted

+0

@ m0stwanted : 분명히 당신은이 질문에 대한 대답이 시작 단락에 분명하게 명시되어 있기 때문에이 모든 것을 이해하지 못합니다. –

+0

이중 포인터 나 참조를 사용하여 내 값을 반환 할 수 있다는 것을 알고 있지만 왜 함수 내에서이를 변경할 수 없습니까? – m0stwanted

0

이것은 분명히 숙제입니다 문제.

버퍼 buf (크기 : max)이 전달되고있는 것으로 추측됩니다. temp이 필요하지 않으므로 끝에서 쓴 것이 아니라는 것에 매우주의해야합니다. 뭔가 ..

void MClass::GetS(char* buf, int max) const { 
    if(!buf) { 
    return; 
    } 

    for (int i = 0; i < max - 1; i++) { 
     buf[i] = src[i]; // How long is `src`? 
    } 
} 

이 현대 C++하지 않고, 당신이 직접이 일을한다면, 함수가 (srcnull이 종료 가정) std::string MClass::GetS() const { return src; }로 선언 될 것이다. 교사를 교정하십시오.

관련 문제