Jiyong's STUDY

간단한 C언어의 메모리 구조 정리, 스택 영역 접근시 주의할 점 본문

프로그래밍/C

간단한 C언어의 메모리 구조 정리, 스택 영역 접근시 주의할 점

Kingjiyong 2018. 5. 31. 04:13

C언어의 메모리 구조를 간단하게 알아보면


코드 영역


여기에는 이름 그대로 코드가 담겨있다. 

CPU는 필요할 때 마다 이 코드 영역에서 명령문을 가져간다.



데이터 영역


프로그램이 실행되었을 때부터 종료될 때까지 

할당되어 해제되지 않는 변수가 이 데이터 영역에 상주한다.

static 변수나 전역변수가 이 데이터 영역에 있다.


전역 변수는 이해가 되지만, static 변수에 대해서는 이해가 가지 않을 수 있다.

static 변수는 static 지역변수라고 불리기도 하는데, 

지역변수는 함수 안에서 선언되기 때문이다.

하지만, 실제로는 static 지역변수 또한 프로그램이 시작되면 할당이 된다.


힙 영역


사용자가 직접 할당하고, 해제할 수 있는 메모리는 힙 영역의 메모리이다.

이 영역엔 사용자가 변수를 할당하고, 해제 할 수 있다는 의미인데 

이에 대해서는 동적 할당을 배우면서 알게 된다.


스택 영역


지역 변수와 매개 변수와 같이 함수를 빠져나가면 할당이 해제되는

즉, 소멸되는 변수들은 이 스택 영역에 존재하게 된다.




참고로 소멸된다는 의미는 그 메모리에 저장된 데이터를 0으로 초기화한다는 의미가 아니다.

소멸된 영역은 컴퓨터가 그 영역은 쓰이지 않는 영역이다. 그러니까 빈 영역이라고 판단하는 것일 뿐이다.


그에 대한 예제로


char* Example(void) {

char str[20];

printf("input string : ");

scanf("%s", str);

return str;

}


int main() {

char *ptr=NULL;

ptr=Example();

puts(ptr);

}


Example 함수에서 문자열을 입력 받아 char형 배열에 저장했다.

그리고 배열의 주소값을 반환하여 main함수의 포인터 변수에 저장했다.

puts 함수를 이용하여 그 결과값을 출력해보면

Example 함수에서 입력한 값이 출력 된다.


함수에서 빠져나가면 지역 변수는 소멸된다고 했지만, 실제로 접근해 본 결과는 아니었다.

하지만 이러한 코드는 문제를 가지게 되는데,

두 번 이상 Example 함수를 호출을 하면 처음 반환된 주소값은 의미를 잃게 된다.

이를 인지하고 코드를 작성해야 한다.