Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- BOJ
- 생활코딩
- programmers
- 인프런
- 따라하면서 배우는 C언어
- udemy
- Algorithm
- graph
- Python
- 따배씨
- 정수론
- DP
- Math
- sorting
- Cleancode
- C언어
- php
- BFS
- String
- 종만북
- 백준
- 따라하며 배우는 C언어
- JavaScript
- C
- web
- dfs
- BASIC
- Algospot
- greedy
- server
Archives
- Today
- Total
몽상실현개발주의
[따배씨] 12.13 메모리 동적 할당 본문
따배씨 - 따라하며 배우는 C언어
12강 Storage Classes, Linkage and Memory Management
12.13 메모리 동적 할당 Dynamic Storage Allocation
- 동적 할당 메모리는 포인터만 가져오고 인식자가 없음
- Heap 메모리 영역에 저장, 프로그래머가 반납하기 전까지 유지
- 프로그램이 종료되면 자동 반납
- 필요한 메모리의 크기를 미리 알 수 없을 경우 사용
- Runtime 에 메모리 크기가 결정되는 경우, VLA 가변 길이 배열 등
#include <stdio.h>
#include <stdlib.h> // malloc(), free()
int main(){
/*
malloc() returns a void type pointer.
void% : generic pointer
free() deallocates the memory
*/
double* ptr = NULL;
ptr = (double*)malloc(30 * sizeof(double));
if (ptr == NULL){
puts("Memory allocation failed.");
/*
exit(EXIT_FAILURE) is similar to return 1 IN main().
exit(EXIT_SUCCESS) is similar to return 0 IN main().
*/
exit(EXIT_FAILURE);
}
printf("Before free %p\n", ptr);
// Before free 0x100611950
free(ptr);
printf("After free %p\n", ptr);
// After free 0x100611950
ptr = NULL; // optional
return 0;
}
double* ptr = NULL;
ptr = (double*)malloc(30 * sizeof(double));
- 운영체제에게 메모리를 요청할때는 Memory allocation - malloc() 함수 사용
malloc(필요한 공간 입력, size_t type);
- 입력한 공간 만큼 heap 메모리 공간을 할당
- 할당된 연속된 메모리 공간의 첫번째 주소를 반환
- 반환 값은 void 형의 pointer - generic pointer
(double*)malloc(필요한 공간 입력, size_t type);
- 반환 된 void 형의 pointer 값을 double 형의 pointer 로 변환
if (ptr == NULL){
exit(EXIT_FAILURE);
}
- 메모리 공간이 할당되지 않았을 때의 Error 처리
exit(EXIT_FAILURE);
- 어떤 위치에서든 프로그램 강제 종료
free(ptr);
ptr = NULL; // optional
- 메모리를 반환 하여도 ptr 값은 메모리 주소를 가르키고 있으므로, NULL 처리 하는것이 좋다
#include <stdio.h>
#include <stdlib.h> // malloc(), free()
int main(){
/*
Dynamically Allocated Array
*/
int n = 5;
double* ptr = (double*)malloc(n * sizeof(double));
if (ptr != NULL){
for (int i = 0; i < n; ++i)
printf("%f ", ptr[i]);
printf("\n");
for (int i = 0; i < n; ++i)
*(ptr + i) = (double)i;
for (int i = 0; i < n; ++i)
printf("%f ", ptr[i]);
printf("\n");
}
free(ptr);
ptr = NULL;
return 0;
}
- 동적 할당 메모리를 길이가 변할 수 있는 배열처럼 사용 가능, VLA 보다 동적 할당 메모리가 선호됨
- 동적 할당 메모리를 배열로 사용하면 크기를 변화시키는 것이 가능한 것이 장점
- VLA 는 stack 영역(컴파일러에 따라 다름), 동적할당 메모리는 Heap 영역
- Heap 영역의 크기가 stack의 크기보다 큼
이 글의 모든 사진과 내용의 출처는 홍정모 교수님께 있음을 알려드립니다.
http://blog.naver.com/atelierjpro
http://www.inflearn.com/course/following-c
'Language > C' 카테고리의 다른 글
[따배씨] 12.15 동적 할당 메모리를 배열처럼 사용하기 (0) | 2021.06.15 |
---|---|
[따배씨] 12.14 메모리 누수와 free() 의 중요성 (0) | 2021.06.15 |
[따배씨] 12.12 난수 생성기 모듈 만들기 예제 (0) | 2021.06.14 |
[따배씨] 12.10 변수의 저장 공간 분류 요약 정리 ~ 12.11 함수의 저장 공간 분류 (0) | 2021.06.14 |
[따배씨] 12.9 정적 변수의 내부 연결 (0) | 2021.06.14 |
Comments