선언과 정의 중에서 정의에 해당하는 포인터 할당에 대해서 말한 것일 것입니다.
선언시에는 할당된 문자열이 스코프(범위) 내에서는 보호받지만(메모리 할당) 정의과정에서 할당된 문자열은
보호받지 못합니다. 즉, 다른 문자열들이 할당을 하게되면 기존 할당한 문자열의 주소 범위가 침범될 수 있습니다.
char* p = "Hello C"; // 선언 할당 (보호)
p = "Hello ?"; // 정의 할당(비보호) ... 사실 메모리 할당이 안된것입니다.
// 테스트 하려면 정의 할당을 시도하시고 아래쪽에서 new, delete 같은 할당이든 변수 할당이든 여러번 시도하고 p 포인터를 점검해 보세요.(물론 p포인터는 길수록 좋습니다. ^^;)
예전에 비슷한 내용을 테스트 했던 기억이 있습니다.
(물론 책에서도 봤지만... 책인지 그냥 아티클인지... -_ -; 기억이...)
위 글이 두루뭉실 하여 좀 검색해보니 좋은 글이 있었습니다. (나중에 좀 정리하겠습니다. 쩝 --;;)
http://shinlucky.tistory.com/213
이명훈 님이 쓰신 글 :
: 안녕하세요.
:
:
: #include
: #include
:
: int main(void)
: {
: char* literal_p = "Hello C";
:
: literal_p[6] = 'J'; // 1번
: puts(literal_p);
:
: strcpy(literal_p, "Hello C"); //2번
: puts(literal_p);
:
: return 0;
: }
:
:
:
: literal_p가 "Hello C"라는 문자열 상수를 가리키고 있고
: 그것의 값을 변경할 수 없기 때문에,,
: 실행중 오류가 나야한다고 하는데,
:
: 제가 할 때는 오류가 발생하지않고 잘 실행되었습니다..
: ,이유가 무엇 때문인지 궁금합니다.
:
:
: 에디트 플러스에 Borland C++ 5.5 Compiler 등록해서
: 인수는 터보C 포럼 자료실에 있는 ini파일을 사용했습니다.
: -v -IC:\Borland\BCC55\include -v -LC:\Borland\BCC55\lib -n"$(FileDir)" "$(FilePath)"
|