Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[6444] Re:Re:포인터와 문자열 상수 에서 질문입니다.
남병철.레조 [lezo] 4787 읽음    2009-09-05 13:28
평일 너무 바빠서 결국 주말에 글을 적네요. ㅎㅎ -_-;;

문자열 상수에 대해서는 링크를 참조하시면 대략 이해가 되시리라 생각됩니다.
다만 VC++과 C++Builder의 경우 컴파일 해보니 차이가 좀 나네요.

VC++의 경우는 문자열 상수 섹션을 수정할때 예외를 뿜어내고 실행이 중단됩니다.
C++Builder의 경우는 잘? 실행됩니다.

링크된 글에도 살짝 언급되어있지만 PC는 RAM을 메모리로 사용하기 때문에 모든 내용이 RAM에 로딩됩니다.
임베디드는 다를 경우가 있나봅니다.

RAM에 복사될 경우 문자열 상수 섹션의 구색을 갖춰서 메모리 할당 위치가 잡히긴 하지만 결국 RAM...
C++Builder는 모두 RAM이라는 가정으로 처리하니 그냥 잘 실행됩니다.
VC++은 수정 불가한 오류가 나타납니다.... 하드웨어에 따라 상황이 변할 수 있으니 기본적인 섹션 구분에 대한
무언가 경고는 있었으면 좋을것 같은데...

PC에서 VC++은 RAM에 로딩되었지만 const와는 좀 다른 메모리 섹션 구분에 의한 const적 의미를 남겨서
프로그램 실행을 불가하게 합니다.

C++Builder는 RAM에 올려 놓았고 PC는 전부 RAM에 올리니 구분은 하되 섹션 구분에 의한 const적 의미는 과하다는
결론으로 그냥 잘 실행되는 경우라 볼 수 있습니다.

개인적으로 RAM에 올리는건 컴파일러에서 정하는 것이니 그럴경우 섹션 구분에 대한 경고는 있었으면 더 멋진
컴파일러가 아닐까 생각됩니다.

PC 컴파일러의 경우 RAM에 사용하니 warning 정도로 표시하고 그냥 사용은 되었으면 하는 생각이 듭니다.
경고없는 C++Builder도 좀 찜찜하고... 예외 발생해서 피곤하게 하는 VC++도 그렇고...(여럿이서 소스 만들면 피곤해짐)

아직 임베디드를 정식으로 지원하지 않는 상황이라 C++Builder의 이런 입장도 이해는 가지만 다음 버전의 멀티 플랫폼이 현실화 되면 이 부분도 분명 집고 넘어갈 거라 생각됩니다.
이 부분을 컴파일러 프로그래머가 어떻게 다루고 넘어갈지도 지켜볼 재미거리중 하나이겠네요. ㅎㅎ
(그냥 VC++처럼 보수적으로 모든 플랫폼에 예외 발생하면 쉬울듯 하지만...)


남병철.레조 님이 쓰신 글 :
: 선언과 정의 중에서 정의에 해당하는 포인터 할당에 대해서 말한 것일 것입니다.
:
: 선언시에는 할당된 문자열이 스코프(범위) 내에서는 보호받지만(메모리 할당) 정의과정에서 할당된 문자열은
: 보호받지 못합니다. 즉, 다른 문자열들이 할당을 하게되면 기존 할당한 문자열의 주소 범위가 침범될 수 있습니다.
:
:
: 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)"

+ -

관련 글 리스트
6397 포인터와 문자열 상수 에서 질문입니다. 이명훈 6179 2009/08/29
6427     Re:포인터와 문자열 상수 에서 질문입니다. 아~자~~! 24448 2009/09/03
6426     Re:포인터와 문자열 상수 에서 질문입니다. 남병철.레조 8832 2009/09/03
6444         Re:Re:포인터와 문자열 상수 에서 질문입니다. 남병철.레조 4787 2009/09/05
6451             안녕하세요. 이명훈 24645 2009/09/06
6415         Re:Re:포인터와 문자열 상수 에서 질문입니다. 이명훈 5568 2009/09/01
6420             Re:Re:Re:포인터와 문자열 상수 에서 질문입니다. 김진호.불사새 9686 2009/09/02
6416             Re:Re:Re:포인터와 문자열 상수 에서 질문입니다. Lyn 6602 2009/09/01
6425                 불사새님, Lyn님 답변 감사합니다. 이명훈 8841 2009/09/02
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.