728x90
프로그램이 메모리를 할당 받는 방법
정적 static
동적 dynamic
정적 메모리 할당
프로그램 시작 전 미리 정해진 크기의 메모리 할당
- 결정된 크기보다 더 큰 입력이 들어온다면 처리 못함
- 더 작은 입력 들어오면 메모리 공간 낭비
동적 메모리 할당
실행 도중 메모리를 할당
- 사용 끝나면 시스템에 메모리를 반납
- 필요 만큼만 할당 받아, 메모리 효율적 사용
int *p;
p = (int *)malloc(100*sizeof(int)); // 100개의 정수 할당
...
free(p); //p가 가리키는 동적 메모리 반납
예제 #1
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int* list;
list = (int *)malloc(3 * sizeof(int)); //동적메모리 할당
if (list == NULL) {
printf("동적 메모리 할당 오류\\n");
exit(1); //프로그램 전체 종료
}
list[0] = 10;
list[1] = 20;
list[2] = 30;
free(list); //동적 메모리 해제
return 0;
}
💡 return -1; 은 함수 내에서 어떤 문제가 발생했음을 호출자에게 알리는 역할
exit(1); 은 프로그램 전체를 종료시키는데 사용되며 비정상 종료 상황을 나타내는 역할
int i = 3;
int a[i]; 는 불가함
BUT, malloc(i)은 가능
📢 스택 : 정적할당
힙 : 동적할당
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int* list;
int i, students;
printf("학생의 수:");
scanf("%d", &students);
list = (int*)malloc(students * sizeof(int)); //학생 수만큼 받아옴
if (list == NULL) {
printf("동적 메모리 할당 오류\\n");
exit(1);
}
for (i = 0; i < students; i++) {
printf("학생 #%d 성적:", i + 1);
scanf("%d", &list[i]);
}
printf("============================\\n");
for (i = 0; i < students; i++) {
printf("학생 #%d 성적: %d \\n", i + 1, list[i]);
}
printf("=============================\\n\\n");
free(list);
return 0;
}
callloc()
0으로 초기화된 메모리 할당
항목 단위로 메모리 할당
잘 안 씀
realloc()
할당하였던 메모리 블록의 크기 변경
쓰는 경우 못 봄
연결 리스트(linked list)
각 항목이 포인터를 사용하여 다음 항목을 가리킴
- 랜덤 접근이 어려움
- 문제에 나오지만, 실제론 잘 안 씀
- 중간에 데이터 삽입, 삭제 쉬움
- 데이터 저장 공간 필요 마다 동적으로 공간 만들어 쉽게 추가 — 구현 어렵, 오류 쉬움 — 중간에 있는 데이터를 빠르게 가져올 수 x
- 노드 = 데이터 필드 + 링크 필드 노드는 동적으로 생성
- 헤드 포인터 : 첫번째 노드 포인터
자기 참조 구조체 (self-referential structure)
멤버 중 같은 타입의 구조체를 가리키는 포인터가 존재
728x90
'Programming > C' 카테고리의 다른 글
[C] 간단한 MP3 플레이어 제작 (1) | 2024.01.10 |
---|---|
16. 전처리 및 다중 소스 파일 (1) | 2023.10.19 |
15. 스트림과 파일 입출력 (1) | 2023.10.19 |
13. 구조체 (0) | 2023.10.19 |
12. 문자열 (0) | 2023.10.19 |