-
[열혈] 메모리 관리와 동적 할당프로그래밍/C언어 2017. 1. 4. 16:05
메모리 공간 (by 운영체제)
코드 영역(Code Area) : 프로그램 코드가 저장되는 공간. CPU는 프로그램을 실행시킬 때 이 영역에 저장된 명령어를 이용한다.
데이터 영역(Data Area): 전역변수와 static으로 선언된 static 변수가 할당되는 곳.
스택 영역(Stack Area): 지역변수, 매개변수 (함수가 종료될 때 소멸)가 할당되는 곳.
힙 영역(Heap Area): 프로그래머가 원하는 시점에 할당하고 소멸시킬 수 있는 변수가 할당되는 곳.
메모리의 동적할당
전역변수와 지역변수로 해결되지 않는 상황
지역변수의 한계
코드 ReadStringFault1.c
#include <stdio.h> char * ReadUserName(void) { char name[30]; printf("What is your name? "); gets(name); return name; } int main(void) { char * name1; char * name2; name1 = ReadUserName(); printf("name1: %s \n", name1); name2 = ReadUserName(); printf("name2: %s \n", name2); return 0; }
실행결과
문제점!
프로그램 사용자로부터 받는 문자열 배열이 지역적으로 선언되었기 때문에 함수를 빠져나오면 소멸된다.
--> 실행하면 정상적인 결과 X
전역변수의 한계
코드 ReadStringFault2.c
#include <stdio.h> char name[30]; char * ReadUserName(void) { printf("What is your name? "); gets(name); return name; } int main(void) { char * name1; char * name2; name1 = ReadUserName(); printf("name1: %s \n", name1); name2 = ReadUserName(); printf("name2: %s \n", name2); printf("name1: %s \n", name1); printf("name2: %s \n", name2); return 0; }
실행결과
문제점!
하나의 전역변수를 사용하면 마지막으로 저장된 내용으로 덮어쓰게 된다.
필요한 변수의 유형은??
<함수가 호출될 때마다 새롭게 할당되고, 함수를 빠져나가도 소멸되지 않는 변수!>
메모리 공간 할당과 해제: malloc과 free 함수
힙 영역= '프로그래머가 관리하는 메모리 공간'
-> 이 공간에 필요한 위의 유형의 변수를 할당한다.
#include <stdio.h> void * malloc(size_T size); // 힙 영역으로의 메모리 공간 할당 void free(void * ptr); // 힙 영역에 할당된 메모리 공간 해제
malloc 함수의 반환형은 void형 포인터이므로, malloc 함수의 반환 값에 아무런 가공도 가하지 않으면 할당된 메모리 공간에 접근이 불가능하다.
코드 DynamicMemoryAllocation.c --> 빌드 오류가 생김. - 어디서 오류??
#include <stdio.h> #include <stdlib.h> int main(void) { int * ptr1 = (int *)malloc(sizeof(int)); int * ptr2 = (int *)malloc(sizeof(int)*7); int i; *ptr1 = 20; for (i = 0; i < 7; i++) ptr2[i] = i + 1; printf("%d \n", *ptr1); for (i = 0; i < 7; i++) printf("%d ", ptr2[i]); free(ptr1); free(ptr2); return 0; }
'프로그래밍 > C언어' 카테고리의 다른 글
[씹어먹는 C++] 16 - 0 쓰레드 생성과 종료 (0) 2022.02.28 [열혈] Ch.22 구조체와 사용자의 정의 자료형1 (0) 2016.09.20 [C]문자와 문자열 관련함수 (0) 2016.08.16 [열혈] 도전 프로그래밍 2 (0) 2016.07.27 [스터디책] 열혈 C 프로그래밍 (0) 2016.07.27