본문으로 바로가기

C언어 공부 정리6(동적 메모리)

category C언어/C 2020. 11. 30. 14:14

동적 메모리

 : 동적 메모리 할당, 해제는 전부 개발자의 몫 (하지 않을 경우 메모리 낭비 및 좀비 프로세스 발생)

 : 포인터로 동적 메모리 할당 시 꼭 잡아줘야 한다.

 : 포인터로 동적 메모리 해제를 해줘야 한다.

 

동적 메모리 할당 함수

 1. malloc( ) : 동적 메모리가 쓰레기 값(내가 알지 못하는 값)으로 할당

 2. calloc( ) : 동적 메모리의 값이 0(내가 알고 있는 값)으로 세팅해서 할당

 3. realloc( ) : malloc가 똑같은데 재할당이 가능. 가장 안씀

                 (더 큰 메모리를 할당할 때 주소값이 바뀔수 있고, 기존 메모리는 좀비가 됨)

 

동적 메모리 해제 함수

 : free( )

 

 

malloc()

void * malloc(size_t);	// size_t == unsinged int
			// void * --> 나중에 캐스팅해서 바꿔서 쓰라는 의미
#include<stdio.h>
#include<stdlib.h>	// malloc은 stdlib.h안에 있음.
#include<string.h>

int main()
{
	int num;
	int* p;
	int i;
	scanf("%d", &num);

	//malloc(num * 4);	// int 4byte 인지 char 4개인지 모름
	p = (int*)malloc(num * sizeof(int));	// 동적 메모리 할당. void*를 int*로 캐스팅 

	/*for (i = 0; i < num; i++) 
	{
		p[i] = i;
	}*/
	// 값을 입력하지 않으면 쓰레기 값이 들어가 있음.
	for (i = 0; i < num; i++) 
	{
		printf("%d\n", p[i]);
	}

	free(p);	// 동적 메모리 해제. 메모리 해제를 하지 않으면 메모리 낭비가 발생함
}

 

calloc()

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
	int num;
	int* p;
	int i;
	scanf("%d", &num);

	p = (int*)calloc(num , sizeof(int));	// 동적 메모리 할당. void*를 int*로 캐스팅 

	/*for (i = 0; i < num; i++)
	{
		p[i] = i;
	}*/
	// 값을 입력하지 않으면 0이 들어가 있음.
	for (i = 0; i < num; i++)
	{
		printf("%d\n", p[i]);
	}

	free(p);	// 동적 메모리 해제. 메모리 해제를 하지 않으면 메모리 낭비가 발생함
}

 

 

연습

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void memalloc2(int** pp, int num);

int* memalloc(int num);
void input(int num, int* p);
void disp(int num, int* p);

int main()
{
	int num;
	int* p;

	scanf("%d", &num);
	memalloc2(&p, num);
	//p = memalloc(num);
	input(num, p);
	disp(num, p);
}
// 메모리 할당 2
void memalloc2(int **pp, int num) 
{
	// p의 주소값을 넘겨 포인트포인터에 주소를 담아 할당
	*pp = (int*)calloc(num, sizeof(int));
}

// 메모리 할당 함수
int* memalloc(int num) 
{
	// 해당 값을 p에 return
	return (int*)calloc(num, sizeof(int));
}

// 입력 함수
void input(int num, int* p)
{
	for (int i = 0; i < num; i++) 
	{
		printf("%d : ", i);
		scanf("%d", p + i);
	}
}

// 출력 함수
void disp(int num, int* p) 
{
	for (int i = 0; i < num; i++) 
	{
		printf("%d : %d\n", i, *(p+i));
	}
}
반응형

'C언어 > C' 카테고리의 다른 글

C언어 공부 정리5(구조체)  (0) 2020.11.27
C언어 공부 정리4(다차원 포인터)  (0) 2020.11.26
C언어 공부정리3(포인터)  (0) 2020.11.25
C언어 공부정리2(배열의 주소값)  (0) 2020.11.24
C언어 공부 정리1  (0) 2020.11.23