Jiyong's STUDY
간단한 C언어의 메모리 구조 정리, 스택 영역 접근시 주의할 점 본문
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 함수를 호출을 하면 처음 반환된 주소값은 의미를 잃게 된다.
이를 인지하고 코드를 작성해야 한다.
'프로그래밍 > C' 카테고리의 다른 글
calloc 함수와 realloc 함수 (0) | 2018.05.31 |
---|---|
메모리의 동적 할당. malloc과 free (0) | 2018.05.31 |
fseek, 파일 위치와 관련된 함수. (0) | 2018.05.31 |
구조체의 파일 입출력 방식 (0) | 2018.05.30 |
파일 입출력 함수 fprintf, fscanf (0) | 2018.05.30 |