char *

2014-07-04 3 views
-1

에서 배열 요소에 액세스 저는 C++을 처음 접했고 전체 포인터와 관련하여 여전히 고민 중입니다.char *

문자/문자열 배열의 시작을 가리키는 char *을 반환하는 함수가 있다고 가정 해 보겠습니다.

char* read() { 

char data[] = "this for example"; 
return *data; 
} 

는 나중에 나는이 데이터에 액세스하려면,하지만 난 이런 걸 할 수 있다고 생각하지 않습니다이에 read()에 의해 반환 된 데이터를 사용하는 올바른 방법이 무엇인지

char* data = read(); 
if(data[3] == 's') 
    return true; 

을 예?

+4

로컬 배열에 대한 포인터를 반환하기 때문에 올바른 방법이 없습니다. 함수 외부에서 그것을 참조 해제하는 것은 정의되지 않은 동작입니다. – juanchopanza

+1

"s"란 무엇입니까? 'if (data [3] == s)'줄 – Oxcug

+1

코딩을 C++로 시작한다면, 몇 년 전과 마찬가지로 * 지금 * 배울 수 있습니다. shared_ptr, unique_ptr 등을보십시오. – v010dya

답변

3

함수를 종료 한 후 소멸 될 로컬 배열에 대한 포인터.

1

자동 변수에 대한 포인터를 반환 할 수 없습니다. 정의되지 않은 동작을 호출합니다. 동적으로 data을 할당하십시오.

char *data = new char[20]; 
당신이 대신 std::vector 또는 std::string를 사용하는 것이 더
delete[] data; 

를 사용하여 수행하는 경우

이 할당 된 메모리를 삭제하는 것을 잊지 마십시오. 당신의 read() 기능에

+0

당신은'new []'와'delete []'를 추천하고 있습니까? 'std :: vector' 또는'unique_ptr <[]>' – Praetorian

+0

을'std :: string'으로 사용하십시오. –

1

return *data;char하지char* 반환합니다. 또한 스택 메모리는 함수가 반환 된 후에는 액세스 할 수 없습니다. 정적으로 만드십시오. 그것은해야한다 :이 오류없이 다시 작성하는 경우가를 반환하기 때문에이 정의되지 않은 동작을 할 것이다 다음 표준 클래스 귀하의 코드에 관해서는 std::string

std::string read() 
{ 
    char data[] = "this for example"; 
    return data; 
} 
//... 
std::string data = read(); 
if(data[3] == s) 
    return true; 

를 사용하는 것이 좋습니다이 경우

char* read() 
{ 
    static char data[] = "this for example"; 
    return data; 
} 
+0

명시 적 정적 배열을 만드는 대신 문자열 리터럴 자체를 반환하지 않는 이유는 무엇입니까? 이것은 지나치게 불필요하게 복잡하며 예를 들어 "return"이라고 쓰면 똑같은 일을합니다. –

+0

@ user3477950이 문자열은 문자열을 수정할 수 있기 때문에 동일하지 않습니다. – juanchopanza

+0

@juanchopanza 오 예, 잊어 버렸습니다. 우선, 함수에서 반환 된 char 배열을 수정해야한다고 생각하지 않습니다. 끔찍한 연습이 아닌 것 같습니다. –