2012-07-27 2 views
2

현재 char 및 string 데이터 유형을 분석 중입니다.문자열 포인터에 값 할당

문자열에 대한
char value = 'a'; 
char value1[] = "Good"; 
char* value2 = "Good"; 

,

string strValue = "Good"; 
string strVal[3] = {"Good","Better","Best"}; 

을하지만 할당은 아래의 컴파일 오류가 발생합니다 : char 데이터 유형에 대해 냈다 다음 코드가 좋은 보유 그래서

"error: scalar object strPtr requires one element in initializer"

string* strPtr = {"Good","Better","Best"} 

을, 처음에 string* 이상의 값을 할당하는 방법은 무엇입니까?

덕분에, Udhai

+3

'char * value2 = "좋지 않음"; - 언어 디자인의 오류를 통해 허용되지만 허용되지 않아야하며 더 이상 사용되지 않습니다. 문자열 리터럴은 읽기 전용 메모리에 상주하며,이 명령문에서 비 const 포인터를 첫 번째 요소에 할당합니다. 따라서 문자열을 수정하려고하면 컴파일되지만 런타임에는 작동하지 않습니다. 그 나쁜. –

+0

포인터가 주소를 가리 킵니다. 권리? 따라서 값을 포인터에 "할당"할 때는 포인터를 가리키는 주소의 데이터로 실제로 작업 할 수 있도록 포인터의 값을 참조 해제해야합니다. 참조가 아닌 포인터에 값을 지정하려고하면 가리키는 데이터의 주소를 변경하려고한다는 것입니다. 'string * '에 지정하는 것은 이미 정의되었거나 최소한 선언 된'string'입니다. – ChiefTwoPencils

+0

그동안 수정되지 않았습니까? 나는 요즘 (C++ 0x 또는 어쩌면 표준의 이후 버전) 문자열 리터럴이 항상 const char * 형식을 가지고 있다고 생각했습니다. (컴파일 오류가 발생합니다). – Axel

답변

3

포인터 배열하지, 왜 그렇지 않으면 척할까요? 그러나 이것을 할 수 있습니다

string strVal[3] = {"Good","Better","Best"}; 
string* strPtr = strVal; 
-1

std::string을 참조하십시오. 당신이 포인터는 문자열 배열의 시작을 가리키는하려는 경우이 문자열로 포인터와

std::string s_arr[3] = {"Good","Better","Best"}; 
string* str_p = strVal; 

을 원하는 경우

올바른 방법은

std::string *s(new std::string); 
// or 
std::string *s = new std::string; 

입니다.

+0

'... (새로운 std :: string;'a가 누락 되었습니까?)? – ChiefTwoPencils

+0

예. 나는 그것을 바로 잡을 것이다.Thanks – steffen

0

이 작동 :

std::string* strPtr{new std::string[3]{"Good","Better","Best"}}; 

이것은 또한

std::string* strPtr{(std::string[3]){"Good","Better","Best"}}; 

를 컴파일하지만, 임시 포인터를 결합, 그래서 그렇게하지 마십시오.

+0

첫 번째 예에서는 스택이 아닌 힙에 배열을 만들고 메모리 누수가 발생하지 않도록 수동으로 삭제해야합니다. – Axel

+0

@Axel : 그것은 평생에 달려 있습니다 ... 글로벌 일 경우 프로그램의 끝날 때까지 전역이 살아야하므로 전역 할당을 해제 할 필요가 없습니다. –

+0

사실이지만 좋지 않은 스타일. – Axel