Pururoong

동적 메모리 할당(Dynamic Memory Allocation) 본문

Programming/C

동적 메모리 할당(Dynamic Memory Allocation)

Pururoong 2011. 10. 28. 01:11

■ C언어에서 변수를 저장하는 방법은 2가지가 있다.

■ 전역, 지역변수, 배열, 구조체는 정적 메모리 할당(Static Memory AlLocation)
    이다.

■ 동적 메모리 할당은 프로그램이 얼마만큼의 메모리를 사용할 지 명확하지 않은 경우에 쓰는 방법이다. 이 방법은 여러가지 위험요소를 가져오기 때문에 꼭 필요한 경우에 사용하는 것이 좋다.

■ 이하 사용함수와 포인터를 이용한 동적 메모리 할당 예제.

-> 동적 할당 함수사용에 필요한 헤더파일 : stdlib.h

사용함수 : calloc(), free(), malloc(), realloc()

-> 메모리 초기화 함수사용에 필요한 헤더파일 : string.h

사용함수 : memset()


 calloc()
 #include <stdlib.h>
 void *calloc(size_t num, size_t size);
 // size 크기의 변수를 num개만큼 저장하는 공간을 할당한다.
 // 할당에 실패하면 NULL을 반환한다.

 free()
 #include <stdlib.h>
 void free(void *ptr); 
 //ptr이 가리키는 기억장소를 해제한다. 해제된 기억장소는 다른 할당을 위해 다시 사용할 수 있다.
 //입력 파라미터로 NULL, 쓰례기 주소가 전달되는경우 프로그램이 죽어버리므로, 메모리 해제시
 에는  반드시 유효한 포인터가 파라미터로  전달되도록 신경써야 한다.


예제>

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

int main()
{
	int size,n,i;

	int* arr;

	printf("할당할 배열의 크기 : ");
	scanf("%d", &size);

	arr = (int*)calloc(size, sizeof(int)); 

	// size*sizeof(int) 만큼의 공간을 확보한다.


	for(i=0; i<size; i++) // 출력

		printf("[%d] : %d\n",i,arr[i]); 


	n=(sizeof(arr)*size)/sizeof(int*); 

	// 배열의 크기

	printf("\n%d\n",n);
	free(arr); // 할당받은 기억 장소 해제

	return 0;
}


 malloc() 
 #include <stdlib.h>
 void* malloc(size_t size)
 // 할당시 size크기의 기억장소의 첫번째 바이트에 대한 주소 반환.
 // 실패시 NULL을 반환.

 realloc()
 #include <stdlib.h>
 void *realloc(void *ptr, size_t size); 
 // ptr이 가리키는 (할당된) 기억장소의 크기를 size만큼 크기로 변경.
 // 크기가 변경되면 메모리 블록이 이동될 수 있으므로 원래의 메모리 블록에 대한
     포인터를 반환한다.


예제 1>

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

int main()
{

	int* a;
	a=(int*)malloc(sizeof(int)); //동적 할당

	if(!a) // a==NULL 할당성공여부 검사 

	{
		printf("Memory AlLocation Fail \n");

		exit(1); // 비정상 종료임을 알려준다.

	}

	// 동적으로 할당된 메모리에 정수 대입
	printf("a : %d\n",*a);

	free(a); //할당받은 공간 해제
}
 

예제 2>

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

int main()
{
	char *p; 
	p = malloc(13); // 13Byte의 공간할당

	if(p==NULL) { // 할당 성공여부 검사
		printf("할당에러! \n");
		exit(1);
	}
	strcpy(p, "Hang on to a");


	p = realloc(p, 28); // 28Byte로 확장
	if(p==NULL) {
		printf("할당에러\n");
		exit(1);
	}
	strcat(p,"runaway train"); //
	puts(p);
	free(p);

	return 0; 
}


 memset 
 #include <string.h>
 void *memset(void *ptr_start, int value, size_t count);
 // 포인터 변수 ptr_start가 가리키는 메모리 영역을 시작으로 모두 count크키만큼을 값 value로
     설정한다.


예제>

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

int main()
{
	char *ptr;
	ptr = (char *)malloc( 10);

	ptr[9] = NULL; 
	memset( ptr, 'A', 9); 

	// ptr의 시작주소에서 NULL까지 문자 A로 초기화	한다.


	printf( "%s\n", ptr);

	free(ptr);

	return 0;
}



////////////////////////////////////////////////////////////////////

기타>


exit()에 관해서....

<stdlib.h>

-- We define these the same for all machines.
Changes from this to the outside world should be done in `_exit'. --

#define EXIT_FAILURE 1

-- Failing exit status. --
#define EXIT_SUCCESS 0

-- Successful exit status. --

// 비정상 종료시 1값을, 정상종료시 0값을 쓰도록 명시하고 있다.


 

Comments