|
권기식 님이 쓰신 글 :
: 안녕하세요?
: 여기에는 처음 글을 올려보네요..
: 빌더 게시판에 올리니 여기 올리라고 해서.. ^^;
:
: 질문은...
: 포인터로 문자열 변수를 생성합니다.
: 그리고 new char[10]을 이용하여 10바이트의 메모리를 할당합니다.
: 여기다가 10문자 이상을 저장하면 어떻게 되나요?
: 할당된 메모리보다 많은 문자를 저장하니깐 11번째 문자부터는 저장이 안될 것으로 생각했는데..
: 막상 해보니깐 모두 저장되더군요...
:
: 배열로 선언하니깐 프로그램에 에러가 나던데...
: 포인터로 선언하니 아무런 문제가 발생하지 않는군요.
:
: 어떻게 된건지 설명좀 부탁드릴께요...
:
: 포인터 공부하다가 생긴 의문점인데... 포인터.. 어렵고 복잡하긴 하지만 재미있네요..
정적 할당과 동적 할당의 메모리 영역이 다르기 때문에 그렇습니다.
일반적인 (지역)변수 정의는 정적 할당이라고 하고요,
스택(stack)이라는 메모리 영역에 할당됩니다.
이 곳은 컴파일러가 지역 변수와 파라미터에 필요한 공간을 정확히 계산해서
그 크기 만큼만 할당하게 됩니다.
함수가 호출될 때마다 그 크기대로 스택에 차곡차곡 쌓이는 구조로 되어 있습니다.
그러므로 한 바이트라도 다른 영역을 침범하면
바로 런타임 에러가 발생하게 됩니다.
반면에 new(C++), malloc(C)으로 런타임에 동적 할당을 하면,
동적 할당 전용의 메모리 공간인 힙(heap)이라는 영역에 따로 저장됩니다.
만약 다른 동적 할당한 메모리가 없다면 할당한 범위를 넘어서 억세스가 가능하긴 합니다만,
반드시 그런 경우라고 가정할 수가 없기 때문에 위험한 동작이라고 할 수 있습니다.
절대 할당한 영역을 침범하는 위험한 프로그램을 하지 마시기 바랍니다!
또한 new, malloc으로 할당한 영역은 그 포인터가 스코프에서 사라지기 전에
반드시 delete(C++), free(C)로 메모리를 해제해야 합니다!
참고로, ANSI C++의 STL을 사용하면,
동적할당을 전혀하실 필요없이 문자열(string)이나 배열(vector, deque)의
크기를 언제든지 바꿀수 있습니다.
STL을 쓰면서부터는 거의 동적 할당을 잊어버리고 살아도 됩니다. ^^;
|