소프트웨어

[c언어] 데이터 영역을 설명한 포스트입니다. 재미있네요ㅎㅎ

개발자_이훈규 2014. 2. 5. 14:44

이걸 알고 있으면 기본적으로 스텍에 선언해야 할지 아니면 힙에 선언해야 할지 어떻게 해야 내가 생각하는 방식대로 동작을 시킬 수 있을지 판단하는데 많은 도움이 될 것 같습니다.


원본 주소는 아래 있습니다^^. 


http://wwww7.com/bbs/zboard.php?id=Study&page=1&sn1=&divpage=1&category=3&sn=off&ss=on&sc=on&select_arrange=headnum&desc=desc&no=57 )



텍스트 영역 :  일반적으로 프로그램의 실행코드가 존재 하는 영역입니다. 
               내 자신이 작성한 코드들이 여기에 속합니다.

데이터 영역 :  전역변수나 정적(static) 으로 사용되는 메모리를 의미 합니다. 
               이를 다시 사용되는 쓰임새에 따라서 3가지로 나눌수 있습니다.
              
              1. 읽기 전용으로 초기화 되는 영역
                일반적으로 .rodata가 대표적인 영역 입니다.  이 부분은 const로 선언된 영역 입니다. 
                그 외에 시스템에 사용된 각종 문자열( print 문의 format string 이나 상수 문자열등이 
                모두 이곳에 속한다. )
              2. 읽기 / 쓰기가 가능한 영역으로 초기화 되는 영역
                .data 영역이 대표적이다. 즉 전역 번수중에 초기값을 가지는 경우를 말한다.

              3. 초기화 되지 않은 영역 ( BSS ( Block Started by Symbol )) 영역이라고 불리는 곳
                 전역변수로 초기화 되지 않고 선언되거나 static으로 선언된 영역을 의미 합니다. 


Stack 영역 :  지역 자동변수 , 즉 임의로 메모리를 잡지 않아도 함수의 시작에서 자동으로 생성되
                고 파기되는 변수를 말한다.  스코프 영역 ( 함수 영역 )을 벗어나면 스택의 frame 릴레
             이에서 해제되므로 자연적으로 파기 된다.  따라서 스코프 안에 존재하는 포인터 변수도
             변수 자체는  auto 변수 이다.  그 안에 담긴 주소값의 영역이 다를 뿐이다. 

힙 ( heap ) 영역 :  힙은 일반적으로 malloc(3) 과 같은 메모리 할당 함수를 사용할 때 받는 메모리
               영역으로서 자동으로 파기 되지 않고 , 힙은 극히 큰 공간이다.  즉 메모리의 전체라고 
               해도 과언이 아니다. 


*  변수의 메모리 위치와 특성 

-- 전역 변수들의 형태에 따른 메모리 위치
int num;    =>  bss 영역에 위치
int num = 1;  =>  data 영역에 위치
char  str[] = "hello world";  =>  data영역에 위치, 읽기/쓰기가 가능
char  *p_str = "hello world" => 문자열 자체는 rodata에 위치 하고 p_str 포인터 변수는 data
                                             에 위치
const char str[] = "hello world" =>  문자열 자체는 rodata에 위치하고 str 변수 자체는 data에 
                                                  위치
static int i_val;  =>  bss 영역에 위치

 



http://wwww7.com/bbs/zboard.php?id=Study&page=1&sn1=&divpage=1&category=3&sn=off&ss=on&sc=on&select_arrange=headnum&desc=desc&no=57