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

C/C++ Q/A
[72] Re:[질문] 문자배열
남병철.레조 [lezo] 2294 읽음    2001-11-30 02:23
안녕하세요? 레조입니다.

new의 사용에 대해 궁금하신가 보네요.
동적 메모리 확보의 간단한 개념을 설명하겠습니다.

메모리 확보에는 크게 정적 메모리 확보와 동적 메모리 확보가 있습니다.
정적 메모리 확보의 간단한 예를 보자면...
int i = 5;
이렇게 하면 i라는 int 변수가 생성되고 그 변수(메모리)에 5라는 값이 기록됩니다.
이때 이 5라는 숫자는 실제 컴퓨터 메모리의 특정 영역에 세팅되며
다음에 int j = 10;이라는 식으로 변수를 확보해도 그 영역에 다시 세팅되지 않습니다.

그럼 동적 확보란?
보시는 데로 정적에서는 변수 선언과 동시에 그 메모리 영역이 확보됩니다.
하지만 포인터 변수같은 경우는 그런 정적 데이터 영역을 확보하는 것이아니라
포인터 변수 즉, 메모리의 주소를 저장할 수 있는 영역만 확보됩니다.
즉 어떠한 타입으로 포인터 변수를 설정해도 동일한 크기가 되는것이죠.
(주소의 크기는 일정하니까요 요즘은 기본이 32bit이니가 4byte이겠네요. ^^)

그럼 포인터 변수에서 메모리를 확보하는 방법은 무엇일까요?
바로 new 또는 malloc을 사용하는 것입니다.
명색에 C++인데 new를 사용하셔야 겠지요. 기능상의 큰 차이는 없습니다.
char *a;
a = new char[3];
이라고 하면 a라는 포인터 변수에 char타입의 메모리 공간이 3개 생기게 됩니다.
마치 정적 변수로 char a[3];이라고 한것과 같은 현상이지요.
차이는 프로그램 도중에 메모리를 확보한다는 것이고 이는 아주 중요합니다.
프로그램 도중에 동적으로 메모리를 확보하게되면 자료구조의 구현이 아주 유연해
지기때문입니다.
음.. 조금 말이 길어지네요..

그럼 간단히 정리해 보겠습니다.
정적 메모리 확보의 경우는
코딩 라인에서 메모리 영역이 확보되어 그 다음에 메모리를 확보하는 경우에 미리 확보한
영역이 겹쳐서 확보되는 일이 없다는 것이지요.(^^ 아시겠지만..)
동적 확보와 차이라면 코딩시에 결정되어진다는 것입니다.

동적 메모리 확보의 경우는
프로그램이 돌아가는 런타임에서도 얼마든지 메모리 확보가 가능합니다.
자료구조중에 아주 유명한 링크 리스트가 바로 그런경우이지요.
(링크 리스트는 자료구조와 담쌓아도 익혀 놓으셔야하는 중요한 기법입니다. ^^;)
그리고 동적 확보에서 주의하실것은 new로 잡아놓은 메모리 영역은 반드시 delete로
해제해 주셔야 합니다.
조금 테스트 해보시면 아시겠지만 delete 명령을 실행해도 포인터 변수는 여전히
이전에 확보해놓은 메모리 주소를 가지고 있습니다.
하지만 차이는 그 주소 영역이 더이상 OS의 보호를 받을 수 없다는 것입니다.
다시말해 언제 다른 변수가 그 메모리 영역을 사용할지 모르는 것이지요.

마지막으로 분명 new로는 char[3]이라고 잡아놓으셨는데.. --;
어떻게 다 출력되냐구요..?
이는 컴파일러의 유연성 때문입니다.
특히 C++의 경우는 그냥 막짜도 그럭저럭 돌아갑니다.
하지만 앞에서 언급했드시 확보되지 않은 메모리 영역이므로 언제 침범될지 알수없죠..
C++프로그램에서 가장 많이 발생하는 액세스 바이얼레이션의 여러 원인중 요주의 원인이라
할 수 있습니다.

동적 메모리 확보, 정적 메모리 확보, 포인터 등의 관계를 제대로 파악하는데는
배열과 링크 리스트를 보는게 좋을것입니다. (알고리즘 공부의 초석이기도합니다.)





던켄 님이 쓰신 글 :
: char *a;
: a = new char[3];
: a="Hello World";
: cout << a << endl;
:
: ====================
: 위 소스에서 두번째 줄은 무슨 역할을 하는 건가요?
: 두번째 줄을 삭제하고 실행시켜도 결과는 같게 나오던데...
: 선배님들의 답변 부탁드립니다.

+ -

관련 글 리스트
70 [질문] 문자배열 던켄 2280 2001/11/29
76     Re:[질문] 문자배열 아리랑 2180 2001/11/30
72     Re:[질문] 문자배열 남병철.레조 2294 2001/11/30
74         조금 잘못된 것이 있어서요... ^^ 박정모 2187 2001/11/30
71     Re:[질문] 문자배열 수야 2168 2001/11/30
79         Re [허접참고] 포인터를 공부해보심이 도움될 듯.. 태즈 2145 2001/12/01
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.