여기에서 C에서 동적 메모리 할당이 무엇인지 볼 것입니다. C 프로그래밍 언어는 메모리 할당 및 관리를 위한 여러 기능을 제공합니다. 이러한 기능은
함수 | 설명 |
---|---|
void *calloc(int num, int size); | 이 함수는 num개의 배열을 할당합니다. 각 요소의 크기는 바이트 단위가 됩니다. |
무효(무효 *주소); | 이 함수는 주소로 지정된 메모리 블록의 블록을 해제합니다. |
무효 *malloc(정수); | 이 함수는 num개의 배열을 할당합니다. 바이트를 초기화하지 않고 그대로 둡니다. |
void *realloc(void *address, int newsize); | 이 함수는 newsize까지 확장하는 메모리를 재할당합니다. . |
동적으로 메모리 할당
프로그래밍하는 동안 배열의 크기를 알고 있으면 쉽고 배열로 정의할 수 있습니다. 예를 들어 사람의 이름을 저장하려면 최대 100자까지 입력할 수 있으므로 다음과 같이 정의할 수 있습니다. -
char name[100];
하지만 이제 저장해야 하는 텍스트의 길이에 대해 전혀 모르는 상황을 고려해 보겠습니다. 예를 들어 주제에 대한 자세한 설명을 저장하려고 합니다. 여기서 우리는 필요한 메모리 양을 정의하지 않고 문자에 대한 포인터를 정의해야 하며 나중에 요구 사항에 따라 아래 예와 같이 메모리를 할당할 수 있습니다 -
예시 코드
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char name[100]; char *description; strcpy(name, "Adam"); /* allocate memory dynamically */ description = malloc( 200 * sizeof(char) ); if( description == NULL ) { fprintf(stderr, "Error - unable to allocate required memory\n"); } else { strcpy( description, "Adam a DPS student in class 10th"); } printf("Name = %s\n", name ); printf("Description: %s\n", description ); }
출력
Name = Zara Ali Description: Zara ali a DPS student in class 10th
calloc()을 사용하여 동일한 프로그램을 작성할 수 있습니다. 다음과 같이 malloc을 calloc으로 교체해야 합니다. -
calloc(200, sizeof(char));
따라서 크기가 정의되면 변경할 수 없는 배열과 달리 메모리를 할당하는 동안 모든 크기 값을 전달할 수 있으며 완전히 제어할 수 있습니다.
메모리 위치 크기 조정
프로그램이 나오면 운영 체제는 프로그램에서 할당한 모든 메모리를 자동으로 해제하지만 더 이상 메모리가 필요하지 않을 때 좋은 습관으로 free() 함수를 호출하여 해당 메모리를 해제해야 합니다.
또는 realloc() 함수를 호출하여 할당된 메모리 블록의 크기를 늘리거나 줄일 수 있습니다. 위의 프로그램을 다시 한 번 확인하고 realloc() 및 free() 함수를 사용합시다 -
예시 코드
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char name[100]; char *description; strcpy(name, "Adam"); /* allocate memory dynamically */ description = malloc( 30 * sizeof(char) ); if( description == NULL ) { fprintf(stderr, "Error - unable to allocate required memory\n"); } else { strcpy( description, "Adam a DPS student."); } /* suppose you want to store bigger description */ description = realloc( description, 100 * sizeof(char) ); if( description == NULL ) { fprintf(stderr, "Error - unable to allocate required memory\n"); } else { strcat( description, "He is in class 10th"); } printf("Name = %s\n", name ); printf("Description: %s\n", description ); /* release memory using free() function */ free(description); }
출력
Name = Adam Description: Adam a DPS student.He is in class 10th
추가 메모리를 재할당하지 않고 위의 예를 시도할 수 있으며 strcat() 함수는 설명에 사용 가능한 메모리가 부족하여 오류가 발생합니다.