본문 바로가기
Programming/C

[C언어] 17. 동적메모리와 연결리스트

by 기딩 2023. 10. 19.
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