C언어의 메모리 구조, 메모리의 동적 할당
================================ Outline ====================================
* 리눅스에서 메모리 주소 보안 옵션 off
C언어의 메모리 구조
메모리의 동적 할당
- malloc 함수
- calloc 함수
- realloc 함수
----------------------------------------------------------------------------
*** 리눅스에서 메모리 주소 보안 옵션 off
랜덤스택이란, 프로그램이 실핼 될때마다, 프로세스 내부에 함수 주소 및 스택, 힙의 주소가 랜덤하게 바뀌는 것이다.
해제 하기위해선,
sysctl -w kernel.randomize_va_space=0
명령어를 사용해서 해제합니다. (루트권한 필요)
C 언어 교재 p/536 <C언어의 메모리 구조>
코드영역은 영어 표기로 Code 또는 Text 영역이라고 부른다.
메모리의 HEAP영역에 대해 알아보자.
//코드 영역을 텍스트 영역이라고 부르기도 한다.
함수를 만들게 되면 기본적으로 다음 함수의 base point와 해당 함수가 끝났을 때 다음 함수로 넘어가는 주소가 저장된다. 때문에 메모리의 주소를 최소화하기 위해서는 인자를 여러 개를 넣는 것 보다는 인자가 존재하는 주소를 입력해 주는 것이 메모리를 줄이는데 효과적이다.
다음 함수의 return 포인트를 활용하여 해킹을 할수도 있다.
/*** 소스 ***/
#include <stdio.h> |
C언어 교재 p/542: <메모리의 동적 할당>
변수의 생성과 소멸의 시기가 지역변수나 전역변수와 다른 유형의 변수는 malloc과 free라는 이름의 함수를 통해서 힙(heap)영역에 할당하고 소멸할 수 있다.
<malloc(memory allocation)함수>
#include <stdlib.h>
void * malloc(size_t size); // 힙 영역으로의 메모리 공간 할당
void free(void * ptr); // 힙 영역에 할당된 메모리 공간 해제
-> malloc 함수는 성공 시 할당된 메모리의 주소 값, 실패 시 NULL 반환
malloc함수를 사용하기 위해서는 받은 주소를 저장하기 위한 포인트 변수가 필요하다.
p/546 예제
동적 할당을 받은 후 free 함수로 해지 않고 덮어쓰는 경우 덮어 씌워진 경우 해당 메모리는 어딘가에 살아있다. 때문에 반드시 malloc함수를 사용하고 나서는 덮어 쓰지 않고 free함수로 할당 받은 메모리를 반환하여야 한다.
<calloc 함수>
#include <stdlib.h>
void * calloc(size_t elt_count, size_t elt_size);
-> calloc 함수는 성공 시 할당된 메모리의 주소 값, 실패 시 NULL 반환
블록 크기(elt_count) * 개수(elt_size)
ex) calloc(10, 30)
10byte블록을 30개 생성 -> 300bytes
<calloc함수의 구현>
<realloc 함수>
#include <stdlib.h>
void * realloc(void * ptr, size_t size);
-> 성공 시 새로 할당된 메모리의 주소 값, 실패 시 NULL 반환
구현은 malloc을 활용하여 기존 동적 할당의 내용을 새로 받은 동적할당 영역에 복사하고 free를 활용하여 기존 동적 할당 내용을 없앤다.
다음 시간은 ch.27
'Busan IT > 공장내 Network' 카테고리의 다른 글
리눅스에서의 압축, 연결리스트 (0) | 2015.05.08 |
---|---|
파일분할, 가변인자, 연결리스트 (0) | 2015.05.07 |
파일의 임의 접근, pcap (0) | 2015.05.04 |
fread, fwrite인자 설명, 파일 hexaview (0) | 2015.05.01 |
fclose를 사용한 표준 입출력 연결, feof, fread, fwrite 함수 (0) | 2015.04.30 |