C언어 - 메모리 동적 할당!! (Dynamic Storage Allocation)

2020. 11. 13. 15:59개인공부/C언어

 

너무 떨린다... 잘 이해할수 있겠지? 안되면 다시 보고 다시 보자.

 

 

포인터만 가져오고 인식자가 없다!

메모리의 위치는 Heap이고 프로그래머가 결정한다.

메모리를 다썼다고 판단되면 프로그래머가 수동으로 반납한다.

혹은 운영체제가 프로그램이 끝났다고 판단되면 강제 회수한다.

 

(Automatic 같은 경우 블록안에서 선언되고 스택안에 들어가고 나오는것이 자동적으로 결정됨.)

 

 

 

 

 

런타임이 되봐야 메모리 크기를 알수있는 경우.

 

해결 방법

Stack에 들어가는 메모리를 크게 잡는 방법.

대부분은 운영체제가 자유공간에 가상메모리를 만들어서 배당해줌.

 

위의 경우 변수에 의해서 메모리 크기가 달라지고 있음.

int main()
{
  int n=0;

  char* arr= (char*)malloc(sizeof(char * n);

  free(arr);

  return 0;
}

free(arr) 의 의미는 arr 메모리 반납.

 

 

 

 

 

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h> // malloc(), free()

int main() {

	//float x;
	//char str[] = "Dancing with a Star";

	//int arr[100];

	/*
		malloc() Memory allocation
		void* : generic pointer

		free() deallocates the memory
	*/

	double* ptr = NULL;

	ptr = (double*)malloc(30 * sizeof(double));
	// 운영체제 한테 메모리를 할당요청.
	// 몇 바이트 사용될지 정한다. 30 * 8 = 240바이트.
	// 운영체제가 가지고 있는 메모리중 힙에 240바이트를 제공(allocate)
	// 제공된 240바이트 공간의 첫번째 주소를 돌려준다.
	// 결국 void type 포인터(그저 주소인것)를 알려준다
	// 쓰는쪽에서 void type 에서 (double*)으로 캐스팅을 해준다
	// 형변환을 해서 특정한 자료형의 배열인것처럼 사용할수 있다.
	// 운영체제가 연속된 공간을 줄수없을때가 있다(너무 프로그램을 많이 띄워놨을때)
	
	// ptr가 block 밖으로 벗어나면 사라진다. (블록 안에있는 자동할당이라)
	// 변수자체가 사라지는것뿐 할당 받은 heap의 메모리는 살아있다.
	// 즉 ptr은 주소를 적어 놓은 쪽지에 불과하다, 쪽지를 잃어버려도
	// 그 주소에 있는 공간은 사라지지 않는다.

	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 0118A588

	free(ptr); // no action occurs when ptr is NULL

	printf("After free %p\n", ptr);
	//After free 0118A588
	// free 를 해도 ptr는 별도의 변수이기 때문에 주소를 가지고있다.

	ptr = NULL; //optional
	// ptr의 메모리는 어떠한 동적할당 메모리를 가르키지 않고있다는 뜻

	return 0;
}

 

 

 

 

ptr = (double*)malloc(30 * sizeof(double));


운영체제 한테 메모리를 할당요청.
몇 바이트 사용될지 정한다. 30 * 8 = 240바이트.
운영체제가 가지고 있는 메모리중 힙에 240바이트를 제공(allocate)
제공된 240바이트 공간의 첫번째 주소를 돌려준다.
결국 void type 포인터(그저 주소인것)를 알려준다
쓰는쪽에서 void type 에서 (double*)으로 캐스팅을 해준다
형변환을 해서 특정한 자료형의 배열인것처럼 사용할수 있다.
운영체제가 연속된 공간을 줄수없을때가 있다(너무 프로그램을 많이 띄워놨을때)

ptr가 block 밖으로 벗어나면 사라진다. (블록 안에있는 자동할당이라)
변수자체가 사라지는것뿐 할당 받은 heap의 메모리는 살아있다.
즉 ptr은 주소를 적어 놓은 쪽지에 불과하다, 쪽지를 잃어버려도
그 주소에 있는 공간은 사라지지 않는다.

 

 

 

 

 

 

 

동적 : 컴파일이 아닌 런타임에 결정됨.