c언어

[C언어] 동적 메모리 할당

kidmillionaire1998 2022. 9. 7. 15:23

[C에서의 동적 메모리 할당]

: 효율적인 메모리 사용이 가능하다. 

 

[calloc()과 malloc()]

: 메모리 할당 함수이다. 

 

-두 함수 모두 할당된 메모리 (시작)주소를 리턴한다. 

-배열, 구조체, 공용체를 위한 공간을 동적으로 생성한다. 

-사용 후 free()를 사용하여 메모리를 해제한다. 

cf) 함수에서의 변수는 해당 함수 호출이 끝난 뒤에 자동으로 메모리가 해제된다.  

#include <stdlib.h> 
void * calloc(size_t N, size_t, el_size); 	//0으로 자동 초기화 된다. 
void * malloc(size_t N_bytes); 				//초기와가 진행되지 않는다. 쓰레기 값(garbage value)포함

[예시코드]

#include <stdlib.h> 

int *grade , N; 
scanf("%d", &N); 
grade = (int*)calloc(N,sizeof(int));	//동적 메모리 할당 함수는 return형이 void형인데, grade는 int 포인터 형이므로 형 변환이 필요하다. 
//또는 grade = (int *)malloc(N *sizeof(int)); 

for(i=0; i<N; i++) 
	scanf("%d", &grade[i]); 
    
free(grade); //메모리 할당 해제 
grade = NULL: //이후에 grade에 저장된 주소로 다시 접근하지 못하게 NULL값을 저장

[예시코드 2] 

int(*p)[N], *q; // p는 배열을 포인트하기 위한 배열 포인터이다. 

p = (int(*)[N])calloc(N*N, sizeof(int)); 	//배열 포인터로 형 변환 //1차원 배열 단위로 이동 
q = (int*)p; 								//정수 변수 하나 단위로 이동 
for(i=0; i<N*N; i++)
	q[i] = i; 

for(i=0; i<N; i++) {
	for(j=0; j<N; j++)
    	printf("%3d", p[i][j]); 
    putchar('\n'); 
   	}
free(p); 	//p가 가리키고 있던 2차원 배열의 메모리 할당을 해제한다. 
p=NULL; 	//이후에 해당 배열에 
q=NULL; 	//접근하지 않도록 NULL값을 저장한다.

'c언어' 카테고리의 다른 글

[C언어] 비트 수준 접근  (0) 2022.10.23
[C언어] 공용체(union) / 열거형  (0) 2022.10.12
[C언어] 포인터와 배열  (0) 2022.09.07
[C언어]포인터와 함수  (0) 2022.09.07
[C언어] 포인터 기본  (0) 2022.09.06