2012-02-26 5 views
0

나는 C++과 프로그래밍 전반에 초보자라는 것을 말해야 만합니다. 나는 그 지점으로 곧장 갈 것이다. 모든 문자의 문자열을 문자 배열 (char * 포인터가 아니라 배열)에 할당 할 수 있는지 궁금합니다. 그게 어떤 메모리 주소를 위반합니까? 내가 배우는 책은 그것에 대해 아무 말도하지 않는 것 같습니다. 나는 Google에서도 아무것도 찾을 수없는 것 같습니다.임의의 크기의 문자열을 char 포인터에 할당

+0

'const를 숯불 *의 PTR = "모든 크기의 문자열을"도움이 STL

희망에 대한 참조를입니다 - 거기 STL에서 케이크의 많은입니다. 문자열 리터럴에 대해 전체 읽기 전용 위치를 차지하지 않는 한. – Mahesh

+0

문자열이 너무 길면 오류가 발생한다는 의미입니까? 포인터가 읽기 전용 메모리 위치를 가리키는 경우입니다. – T0rm3nt0R

+1

"메모리 주소 위반"의 의미는 무엇입니까? –

답변

1

char 문자열의 길이는 문자열의 NUL (0) 바이트로 실행될 때 결정되기 때문에 포인터는 길이가 임의의 문자열을 가리킬 수 있습니다. 이 방법으로 문자열을 저장하면 C 문자열이됩니다. 예를 들어 :

const char* str = NULL; // at this point, 
         // doesn't point to anything (not even a string) 

str = ""; // valid 
str = "a"; // valid 
str = "hello"; // valid 
str = "farewell, cruel world"; // valid 
+0

다소 긴 문자열이 일부 읽기 전용 메모리 위치를 덮어 쓰려고하지 않습니까? – T0rm3nt0R

+0

내 마음에 떠오르는 또 다른 질문은 왜 동적 메모리 운영자가 포인터 변수가 차지할 크기를 결정하기 위해 새롭고 삭제 될 것이라고 생각 하는가? 마치 동적 메모리를 사용하지 않고도 원하는만큼 정확하게 포인터를 만들 수있는 것처럼 보입니다. 내가 배우고있는 책은 새로운 것을 사용하고 포인터는 꼭 필요한만큼 커야한다. 이것은 내가 당신에게서 이해할 수있는 것에 따라 정말로 이상하게 보인다. – T0rm3nt0R

+0

@ T0rm3nt0R, Seth의 예제에있는 모든 문자열은 사용자가 요구하는 경우 읽기 전용 메모리에있을 가능성이 큽니다. 문자열이 사용자 입력에서 나왔다면 동적으로 문자열을위한 공간을 할당하는 것이 유용 할 것입니다. –

2

당신은 당신의 문자 포인터가 동적으로

char *str; 

말 C 문자열을 만들려고합니다. 이 포인터는 문자열의 첫 번째 문자를 가리키는 데 사용됩니다. 문자열은 메모리에있는 일련의 연속 문자 (바이트)입니다. 우리는 무엇을 메모리에이를 달성하기 위해 :

str -> +---+---+---+---+---+----+ 
     | H | E | L | L | O | \0 | 
     +---+---+---+---+---+----+ 

주에게 마지막 바이트 -이 바이트의 값은 0과 null 문자 전화 - 그것은 문자열의 끝을 나타내는 우리가있을 때 알고 easilty 한 수 끝까지 오십시오.

str 값을 지정하면이 메모리가 할당됩니다. C++에서이 새로운이

str = new char[6]; 

참고 같이 new operator 수행되는 두 가지 버전의 새로운 [] 및 새로운 못한 - 하나가 다른 하나의 객체를 할당하는 오브젝트의 배열을 할당하는 것이다. new []로 할당 한 경우 delete []를 사용하십시오. 마찬가지로 new/delete를 사용해야합니다. 새 문자 []와 삭제 문자를 혼합하지 말고 [] 문자로 새 문자를 병합하지 마십시오.

이렇게하면 6 자의 배열이 할당됩니다. 문자열에 문자를 넣으려면 우리가 차갑게 처리해야합니다.

str[0] = `H`; 
str[1] = `E]; 
... 
str[5] = 0; 

그러나 이것은 지루할 것입니다. 대신 우리는 우리를 위해이 일을 strcpy을 사용할 수 있습니다 : 그것은 모든 널 문자에 대해 알고

strcpy(str, "hello"); 

. 이러한 유형의 문자열에서 작동하는 다양한 함수가 있습니다. string

이것은 C 문자열입니다. 옛날 옛적에 누군가 C++라고 불리는이 새로운 언어를 발명했습니다. 이 언어는 물건이라고하는 다른 아이디어를 사용하여이 물건을 훨씬 쉽게 만듭니다. 표준 템플릿 라이브러리 (또는 STL)를 살펴 봐야합니다. 이 문자열에 대한 참고 사항은 string에서 찾을 수 있습니다. `유효 여기에이

+0

자세한 설명을 주셔서 감사합니다. 포인터를 사용하는 대신 사용자 입력 문자열에 메모리를 동적으로 할당하려는 이유를 설명해주십시오. 문자열 대신 사용자 입력 데이터에 동적 메모리 할당을 사용하는 것이 왜 유용한 지 혼란 스럽습니다. – T0rm3nt0R

+0

C++ 또는 C (위에서 설명한 문자열)를 사용하고 있습니까? –

+0

나는 C로 일해 본 적이 없지만, 도움이된다면 C++에서 새로운 연산자와 delete 연산자를 사용하여 메모리를 할당하는 방법에 대해 이야기하고 있습니다. – T0rm3nt0R

관련 문제