# malloc
[8958] OX퀴즈 C 백준
백준 [8958] 문제 8958번 풀이 입력 받은 리스트 숫자와 같은 결과를 가져야한다. malloc을 사용하여 C언어에서 배열을 동적할당 해준다. 리스트를 입력 받으면 값을 저장하고 리스트의 길이를 구한다. 리스트와 크기를 전달해주면 주어진 조건에 맞게 결과를 구해주는 함수를 구현한다. 느낀점 C++과 달리 C언어는 배열의 동적할당을 사용하기 어렵다고 생각한다.
[SW사관학교 정글] Week05. 탐험 준비 - Malloc Lab
👀 Week05 요약 이번 주는 카네기 멜론 대학교의 malloc-lab 과제를 통해 malloc, realloc, free 함수를 직접 구현해보았다. 개념 공부할 때까지만 해도 포인터가 왜 c에서 악명 높은 존재인지 모르겠다 생각했는데, 막상 실제로 구현을 해보니 그 이유를 알 수 있었다. 포인터 때문에 참 많은 Segmentation fault를 마주했었다 🥲 힘들기는 했지만 내가 직접 힙 영역을 확장하고 메모리를 할당, 해제해보면서 컴퓨터의 본질에 한 발짝 더 다가선 듯 해서 뿌듯한 한 주였다. 📝 관련 개발 일지 [[컴퓨터 시스템] 동적 메모리 할당 - Implicit Free List 개념](https://velog.io/@youngeui_hong/%EC%BB%B4%ED%93%A8%ED%84%B0-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EB%8F%99%EC%A0%81-%EB%A9%94%EB%AA%A8%EB%A6%AC-%ED%9
Unix 프로그래밍 - 2
컴파일 환경 컴파일 > 텍스트로 작성한 프로그램을 시스템이 이해할 수 있는 기계어로 변환하는 과정 컴파일을 한다 = 보통 컴파일 과정과 라이브러리 링크 과정을 하나로 묶어서 수행하는 것 링크 (link) 서로 다른 파일에 흩어져 있던 함수나 클래스들을 한 데 묶어서 링크해주는 작업 main 함수 안에 foo 함수와 bar 함수가 어디에 정의되어 있는 지 위치를 찾고 제대로 함수를 호출하 수 있게 된다. GNU C 컴파일러 : gcc gcc 기능 = C 프로그램을 컴파일해 실행 파일을 생성 형식 = gcc 옵션 옵션 -c : 오브젝트 파일(.o)만 생성 -o 실행 파일명 : 지정한 이름으로 실행 파일을 생성, 기본 실행 파일명은 a.out 사용 예: [예제] 파일명을 별도로 지정하지 않았으므로 a.out이라는 이름으로 실행 파일이 생성 실행 파일명을 ch1_2.out이라 하려면 `-
[C 언어 기초] 동적 메모리 할당: malloc과 free 함수
💾 동적 메모리 할당 👀 동적 메모리 할당이란? 동적 메모리 할당(Dynamic Memory Allocation)은 프로그램이 실행되는 도중에 필요한 만큼의 메모리를 할당하는 것을 의미한다. 즉, 정적 메모리 할당은 프로그램이 실행되기 전에 메모리를 미리 할당하는 방식이라면, 동적 메모리 할당은 런타임에 필요한 만큼의 메모리를 요청하고 사용하는 방식이다. 🤔 동적 메모리 할당은 왜 필요할까? 프로그램들이 동적 메모리 할당을 사용하는 가장 중요한 이유는 프로그램을 실제로 실행시키기 전에는 자료 구조의 크기를 알 수 없는 경우가 있기 때문이다. 이러한 상황에서 아래와 같이 배열의 크기를 정해놓고 사용하는 것은 좋지 않은 방법이다. 배열과 같은 자료구조는 선언시점에 그 크기가 정해지기 때문에, 런타임에 그 크기를 변경하는 것이 불가능하기 때문이다. MAXN은 임의로 정한 값으로 실제 머신에서 가용한 가상 메모리의 크기와는 무관하고, 프로그램의

ptmalloc2 - 1
ptmalloc2? 리눅스에서는 malloc을 통해서 메모리 할당을 할 때에 내부적으로 ptmalloc이라는 함수가 실행된다. 앞으로 편의를 위해 malloc으로 지칭할 것이다. 목표 메모리 낭비 방지 빠른 메모리 재사용 메모리 단편화 방지 구성 요소? chunk 말 그대로 덩어리라는 뜻. malloc을 통해 메모리를 할당하면 생기는 메모리 블럭. 64비트 architecture에서 16바이트 단위로 chunk가 할당된다. 기본적으로 header + data로 구성되어 있다. header의 구성 요소 prev_size address space 상에서의 직전에 할당된 chunk의 크기. size chunk 자신의 할당된 크기. flags A(allocated arena) 자신이 어느 arena에 속해있는지. 후에 서술 예정 M(mmapped) heap 영역인지 mmapped된 메모

[Dreamhack] 메모리 훅 실습 - hook
✅ 문제 --- 🕮 소스 코드 ⚙️실습 환경 Environment 64 bit와 little-endian 형식으로 이루어짐 Full RELRO : 특정 섹션에서 writable권한이 없음 Canary : Buffer Overflow시 canary값을 유지해야함 NX enabled : Shellcode를 주입하여 실행할 수 없음 No PIE : 코드 영역에서 random화가 일어나지 않는다. ✅ 문제 접근 1. 취약점 분석 1) libc_base 구하기 printf 함수를 이용하여 libc에 있는 stdout의 실제 주소를 얻을 수
[Dreamhack] 메모리 Hook
Hook 🔥 hook : 갈고리라는 뜻으로 운영체제가 어떤 코드를 실행하려고 할 때, 이를 낚아채어 다른 코드가 실행되게 하는 것을 Hooking(후킹) 이라고 부른다. Hook Overwrite : Glibc 2.33 이하 버전에서는 malloc()과 free()를 호출할 때 함께 훅(Hook)이 함수 포인터 형태로 존재한다. 이 함수 포인터를 Overwrite하여 코드를 실행하면, Full RELRO를 우회할 수 있다. (Full RELRO에도 libc에는 쓰기가 가능하기 때문이다) > Hook의 작동 방식 libc는 디버깅 편의를 위해 hook 변수가 정의 되어 있다. > ex) malloc_hook ,freehook ,--reallochook malloc()함수는 _mallochook의 값이 NULL인지 검사합니다. NULL이 아니라면 hook에 인자를

Malloc
Malloc 함수 구현하기 동적 메모리 할당 방법을 직접 개발 하며, 메모리, 포인터 개념을 정확히 알고 사용하기. malloc, realloc, free 함수 구현. implicit 방법으로 구현하기 (explicit, seglist, buddy system 방법도 여유되면 구현 해보기) 키워드 시스템 콜 (System Call) 더보기 System Call이란, 응용프로그램이 운영체제의 커널이 제공하는 서비스를 사용할 수 있게하는 방법이다. 예를 들어, 응용프로그램이 파일 시스템을 직접적으로 접근하는게 불가능하다. 그래서 응용프로그램은 커널에 접근하여 파일 시스템을 호출하는 방법을 사용한다. 데이터 세그먼트 (Data Segment) 더보기
[학습] Malloc lab (동적 메모리 할당)
동적 메모리 할당 입력받을 데이터의 크기를 정확히 알 수 없을 때 충분한 공간적 여유를 가지고 미리 고정된 크기로 메모리를 할당 받을 수 있다. 하지만 설정한 크기보다 작은 데이터가 들어오게 된다면 메모리 공간이 낭비된다. 런타임시에 크기를 알 수 있는 자료구조에 대해 동적으로 필요한 만큼의 메모리만을 할당받아 사용하게 된다면 효율적으로 메모리를 관리할 수 있다. 메모리 영역은 크게 코드, 데이터, 힙, 스택 영역으로 나뉜다. 이중 동적 메모리 할당기는 힙이라고 하는 프로세스의 가상 메모리 영역을 관리한다. 스택 영역은 높은 주소 -> 낮은 주소로 확장해나가는 반면 힙 영역은 낮은 주소 -> 높은 주소로 확장해나간다. 힙의 꼭대기를 가르키는 변수가 있는데 brk라고 한다. <img src="https://velog.velcdn.com/images/carrotcookie/post/d199df5e-9929-4b0d-bbc6-121ac9bbe1c
[C] 동적 할당으로 다중 배열 선언하기
c언어에서는 heap에 malloc이라는 함수를 통해서 변수 공간을 만들 수 있다. 그렇다면 어떻게 C언어에서 다중 배열을 동적 할당할 수 있을까? 여기 좋은 블로그가 있어서 그걸 링크로 남겨놓을려고 한다. https://codeng.tistory.com/8 개인적으로 이 블로그에서 나온 해답 중 2번째에 해당하는 모습은 스택에서 다중 배열 만드는 것과 모습이 비슷하고, free도 한번에 된다는 장점이 있어서 좋은 것 같다.
[CS] malloc-lab 구현 - 명시적 가용 리스트
malloc-lab - 명시적 가용 리스트 explicit free list 방식 자세한 것은 이전의 [[malloc-lab 구현 - 묵시적 가용 리스트]] 참고 상수 및 매크로 선언 putFreeBlock() 새 free 블록을 free list의 처음에 추가한다(LIFO). 포인터 freelistp는 free list의 첫 주소를 가리키므로, freelistp가 가리키는 free list 안의 블록과 PRED, SUCC 링크를 진행한다. removeBlock() 할당되거나 연결되는 가용 블록을 free list에서 없앤다. free list 상에서 해당 블록의 이전, 이후 블록을 서로 이어준다. coalesce() place() 할당될 블록을 free list에서 삭제 분할된 경우, 새 가용 블록을 free list에 넣어준다. `f
[CS] malloc-lab 구현 - 묵시적 가용 리스트
malloc-lab - 묵시적 가용 리스트 implicit free list 방식 mm_init() extend_heap() coalesce() find() find_fit() mm_malloc() mm_free() mm_realloc() next fit 구현 전역변수 static void *prev_p 추가 mm_init() 수정 next fit을 수행하는 findnextfit() 구현 mm_free() 수정 참고 Malloc Lab - Implicit

ptmalloc2에 관한 정보..
chunk의 크기에 대한 정보.. 할당할 수 있는 메모리 사이즈는 16바이트의 배수로 정렬된다고 한다. 즉, 필요 바이트 수가 32라면 32바이트가 할당되고, 33이 되는 순간 48바이트가 할당되는 식이다. 그런데 malloc에는 헤더가 존재하고, 이 헤더가 가지는 크기가 16바이트이다. 기본 16바이트를 가지고 있기 때문에 32바이트를 할당하려고 하면 48바이트가 할당되게 된다. 이상한 점 그렇다면, 33바이트를 할당시키려고 하면 총 48 < 33 + 16 < 64 이므로 64바이트가 할당되어야 할 텐데, 실제로 할당된 바이트 수를 보면 48바이트가 할당되었다고 나온다. ???? 해결 chunk의 구조를 보면 첫 8바이트는 prev_size에 해당한다. prev_size가 필요한 이유 : chunk가 할당 해제될 때에 이전 chunk 또한 free 상태라면 병합이 되게 된다. (두 번째 8바이트

W06) Malloc Lab
6주차는 Malloc기능을 직접 만들어보는 과제를 수행하였다. Implicit [Implicit - 구현 코드 보기 : (util: 44, thru 12점) ](https://github.com/yeongseoPark/malloclab-jungle/blob/implicit/mm.c) implicit 까지는 CSAPP 교재 자체에 코드가 존재한다. 그냥 무작정 보고 하기엔 감이 오지 않아서 해당 코드를 보고 따라해보았다 (그 이후로 모든 코드를 베끼게 되는데..) Malloc을 구현하기 위해서, 다음의 이슈들을 코드로 풀어내야 한다. 추적 : 가용 블록(free인)들을 어떻게 지속적으로 추적하는가? 배치 : 새롭게 배치할 블록을 가용 블록들 중에서 무엇으로 선택하는가 ?(xxx- fit) 분할</spa

02장 기본 자료구조
배열이란? 자료구조 정의하기 자료구조: 데이터 단위와 데이터 자체 사이의 물리적 또는 논리적 관계 배열 다루기 배열: 같은 자료형의 변수로 이루어진 요소(element)가 모여 직선 모양으로 줄지어 있는 자료구조 run-time이 아닌 compile-time에 계산되기 때문에 요소의 개수는 상수만 사용할 수 있음. 인덱스 식(subscript expression): 배열의 개별 요소에 접근할 때 사용. 정수형 인덱스(subscript)를 인덱스 연산자 [] 안에 넣은 식. 배열 a 원소의 각 자료형은 int형, 배열 a 자체의 자료형은 int[5]형 선언과 동시에 초기화가 가능 배열의 요소 개수: sizeof(a) / sizeof(a[0]); sizeof(a): 전체 배열이 할당된 메모리의 크기 sizeof(a[0]): 각 요소가 할당된 메모리 크기 즉, 배열의 전체 크기를 베

malloc
동적메모리 할당 동적 메모리 할당기는 힙이라고 하는 가상 메모리 영역 관리 커널은 힙의 꼭대기를 기리키는 변수인 brk를 사용 명시적인 할당기는 프로그램이 명시적으로 할당된 블록을 반환해줄 것을 요구 묵시적 할당기 -> 가비지 컬렉터: 할당된 블록이 더 이상 프로그램에 의해 사용되지 않는지 할당기가 검출할 수 있을 것을 요구 malloc과 free malloc은 블록 내에 포함될 수 있는 데이터 객체에 대해서 적절히 정렬된 최소 size 바이트를 가지는 메모리 블록의 포인터를 리턴한다. 프로그램이 malloc이 할당한 메모리보다 더 큰 메모리를 요구하는 경우 NULL을 리턴 -> errno를 설정 malloc은 리턴하는 메모리를 초기화하지 않음 calloc은 할당된 메모리를 0으로 초기화하는 래퍼함수이다. realloc은 이전에 할당된 메모리의 크기를 변경할려는 경우 사용 malloc은 mmap과 munmap 함수
포인터 malloc 및 free 후 포인터 초기화 예시
> 포인터로 가리키는 곳을 할당한 후에(tmp1이 가리키는 곳) free를 하고 tmp1이 NULL을 가리키도록 초기화를 해주어야 한다. 그렇기 때문에 del_list의 매개변수와 같이 투포인터의 형식으로 받아서 포인터가 가리키는 포인터가 가리키는 곳을 free해주고 포인터가 가리키는 포인터를 NULL로 초기화 시켜준다.
[C++] 힙의 메모리 할당 및 소멸을 위한 new&delete
동적할당 사용할 메모리 공간을 할당하는 것 메모리 공간 사용이 끝난 후, 할당을 해제하는 이유? -> 메모리 공간 낭비를 줄이기 위함! 컴퓨터 메모리 구조 스택 (Stack) : 지역변수와 매개변수 등이 할당되는 임시적인 영역 힙 (Heap) : 동적으로 메모리를 할당하는 곳, 생성 중 크기를 결정 데이터 (Data) : 전역변수, 정적 (static) 변수, 초기화 된 배열 등이 존재 코드 (Code) : 프로그램 & 기계어 명령 존재 malloc & free new & delete new int 형 변수의 할당 double 형 변수의 할당 길이가 3인 int 형 배열의 할당 길이가 7인 double 형 배열의 할당 delete 앞서 할당한 int 형 변수의 소멸 앞서 할당한 double 형 변수의 소멸 앞서 할당한 int 형 배열
메모리 동적 할당
메모리 공간은 변수나 배열 선언을 하여 확보하는 것은 컴파일을 통해 할당된다. 동적 할당은 해당 코드 실행 시점에 공간이 할당된다. malloc, free 함수 malloc: 프로그램 실행 중에 메모리 동적 할당하기 free: 할당된 공간 반환하기 int형 변수는 4바이트, double형 변수는 8바이트를 할당해야한다. sizeof 연산자를 사용하여 이 크기를 계산하여 컴파일러가 해당 자료형만큼의 공간을 할당해준다. void *malloc(unsigned int size) (void *)을 반환하는 함수로 용도에 맞는 포인터형으로 형 변환이 되어 사용된다. -> 포인터를 반환 void free(void *p) void형 함수로 반환값이 없음 > pi = (int *) malloc(sizeof(int)); 저장공간을 int형 변수의 크기만큼 할당하고 (void *)형 반환 반환된 주소를 int형 변수의 주소로 형 변환 i

[Malloc Lab] Overline
📌 목적 📍 해당 실습을 통해 직접 동적 메모리 할당기(storage allocator)를 구현한다. 📍 Malloc, Free, Realloc을 구현한다. 📍 mdriver가 memory ultilization(메모리 이용도), throughout(처리량) 측면에서 품질을 평가한다. 📌 왜 동적 메모리 할당기를 사용하는가? 프로그램들이 동적 메모리 할당을 사용하는 가장 중요한 이유는 종종 이들이 프로그램을 실제로 실행시키기 전에는 자료구조의 크기를 알 수 없는 경우들이 있기 때문이다. 최대 배열 크기를 가진 정적 배열로 만들면 해결 될 수 있겠지만 과도하게 메모리를 낭비하는 방법으로 그렇게 좋은 방법은 아니다. 또 배열을 정해진 크기를 발생할 경우 문제가 발생한다. ![](https://velog.velcdn.com/images/daelkdev/post/400cf8b7-5ea4-474f-9d97-a2f52146eb