수업중 어셈블리어 문제를 풀다가 malloc 함수가 나왔는데..
그게 뭐죠 ? 분명 배운건데 생각이 안난다.
대충 찾아보니 동적할당이라고 한다.
메모리의 구조부터 정리하면서 들어가 보도록 하자.
1. C언어의 메모리 구조
코드 (기계어로 변환된 코드) |
← 코드 영역 |
전역변수 static 변수 |
← 데이터 영역 ←힙(Heap) 영역
|
프로그래머 할당 . . . (런타임에 크기 결정) | |
: | |
(컴파일 타임에 크기 결정) . . . 지역변수 매개변수 |
1) 데이터(Data) 영역
#include<stdio.h> int a = 10; int b = 20; int main(){ .... return 0; } |
|
변수 a와 b는 전역변수로 main함수가 호출되기전에 데이터영역에 할당된다.
프로그램이 끝나기전까지 존재 하기 때문에 다른 함수에서도 호출될때 이 변수를 활용 할 수 있다.
2) 스택(stack) 영역
#include <stdio.h> void fct1(int); void fct2(int); int a=10; int b=20; int main(){ int i = 100; // main스택프레임부에 할당 fct1(i); fct2(i); return 0; } void fct1(int c) { int d=30; // fct1 스택 프레임부에 할당 } void fct(int e){ int f=40; // fct2 스택 프레임부에 할당 } |
▼
fc1() 함수가 끝나면 삭제되고 다음함수 실행 (에필로그 및 인자정리) ▼
|
3) Heap영역
- 필요에 의해 동적으로 메모리를 할당 할 때 사용
* 힙영역을 사용하는 이유 ?
int main(){ int i = 0 ; scanf("%d", &i); int arr[i]; ruturn 0 ; } |
i의 크기가 4바이트라는 것은 알수 있으나 arr의 배열의 크기는 알 수 없다.
이 부분은 런타임시에 결정이 되기 떄문에 동적으로 할당 해 주어야 한다.
2. malloc
- 동적으로 메모리를 할당하는 함수
#include <stdlib.h> void* malloc(size_t size) |
함수호출시 지정한 크기만큼 메모리를 할당하고
그 주소(첫번째 바이트의 주소)를 리턴받는다.
메모리할당에 실패하면 NULL이 리턴된다.
리턴값이 주소기 때문에 값을 참조하기 위해서는 포인터를 사용해야 한다.
그래서 void*이 나오는것.
- free함수
#include<stdlib.h> void free(void* ptr) |
ex)malloc 함수 사용 예제
#include<stdio.h> #include<stdlib.h> int main(void){ int* a; a = (int*) malloc(sizeof(int));
if(a == NULL) { puts("메모리 할당 실패"); exit(1); } *a = 20; printf("힙에 저장된 변수 a: %d \n", *a);
free(a); // 메모리 해제 return 0; } |
a = (int*) malloc(sizeof(int)); 부분에서 메모리를 할당하고
if 문은 리턴이 null값이면 메모리할당에 실패한 것이므로 그 유무를 체크해 준다.
마지막에 free로 할당된 메모리를 해제 해 주어야 한다.
* malloc 함수 사용 예제 : https://www.joinc.co.kr/w/Site/C/Documents/malloc
'미분류' 카테고리의 다른 글
DDoS 공격 유형 정리#1 (0) | 2018.06.15 |
---|---|
DDoS 공격 대응 (0) | 2018.06.15 |
170316 어셈블리 언어 (0) | 2017.03.16 |
170316 Caller & Callee , 함수 호출 규약 (0) | 2017.03.16 |
170314 리눅스, 우분투 설치 및 C 소양교육 (0) | 2017.03.16 |