malloc(), calloc() 함수를 사용하여 C에서 동적 메모리 할당
C 동적 메모리 할당을 배우기 전에 다음 사항을 이해해 봅시다.
C의 메모리 관리는 어떻게 작동하나요?
기본 데이터 유형을 사용하여 변수를 선언하면 C 컴파일러는 자동으로 메모리 풀에 있는 변수에 대한 메모리 공간을 할당합니다. 스택.
예를 들어, float 변수는 선언될 때 일반적으로 플랫폼에 따라 4바이트를 사용합니다. 우리는 다음을 사용하여 이 정보를 확인할 수 있습니다. 크기 아래 예와 같이 연산자
#include <stdio.h> int main() { float x; printf("The size of float is %d bytes", sizeof(x)); return 0;}
출력은 다음과 같습니다
The size of float is 4 bytes
또한 지정된 크기의 배열은 연속적인 메모리 블록에 할당되며 각 블록은 하나의 요소에 대한 크기를 갖습니다.
#include <stdio.h> int main() { float arr[10]; printf("The size of the float array with 10 element is %d", sizeof(arr)); return 0;}
결과는 다음과 같습니다.
The size of the float array with 10 element is 40
지금까지 배운 것처럼 기본 데이터 타입이나 배열을 선언하면 메모리가 자동으로 관리된다. 그러나 C에는 프로그램(런타임)을 실행할 때까지 배열 크기가 결정되지 않은 프로그램을 구현할 수 있도록 하는 메모리 할당 프로세스가 있습니다. 이 과정을 "다이니믹한 메모리 할당. "
C의 동적 메모리 할당
동적 메모리 할당 프로그래밍 요구 사항에 따라 메모리를 수동으로 할당하고 해제하는 것입니다. 동적 메모리는 힙이라고 하는 영역에서 새로 할당된 메모리 공간을 가리키는 포인터를 통해 관리되고 제공됩니다.
이제 런타임에 문제 없이 동적으로 요소 배열을 생성하고 삭제할 수 있습니다. 정리하자면, 자동 메모리 관리는 스택을 사용하고, C 동적 메모리 할당은 힙을 사용합니다.
그만큼 라이브러리에는 동적 메모리 관리를 담당하는 기능이 있습니다.
함수 | 목적 |
---|---|
malloc () | 요청된 크기의 메모리를 할당하고 첫 번째 바이트에 대한 포인터를 반환합니다. 할당된 공간. |
호출() | 배열 요소에 대한 공간을 할당합니다. 요소를 XNUMX으로 초기화하고 메모리에 대한 포인터를 반환합니다. |
진짜 할당() | 이전에 할당된 메모리 공간의 크기를 수정하는 데 사용됩니다. |
무료() | 이전에 할당된 메모리 공간을 해제하거나 비웁니다. |
위의 기능에 대해 해당 애플리케이션에 대해 논의해 보겠습니다.
C의 malloc() 함수
C malloc() 함수는 메모리 할당을 나타냅니다. 메모리 블록을 동적으로 할당하는 데 사용되는 함수입니다. 지정된 크기의 메모리 공간을 예약하고 메모리 위치를 가리키는 널 포인터를 반환합니다. 반환된 포인터는 일반적으로 void 유형입니다. 이는 C malloc() 함수를 어떤 포인터에도 할당할 수 있다는 의미입니다.
malloc() 함수의 구문:
ptr = (cast_type *) malloc (byte_size);
여기
- ptr은 Cast_type의 포인터입니다.
- C malloc() 함수는 byte_size의 할당된 메모리에 대한 포인터를 반환합니다.
malloc()의 예:
Example: ptr = (int *) malloc (50)
이 명령문이 성공적으로 실행되면 50바이트의 메모리 공간이 예약됩니다. 예약된 공간의 첫 번째 바이트의 주소는 int 유형의 포인터 ptr에 할당됩니다.
또 다른 예를 고려해보세요:
#include <stdlib.h> int main(){ int *ptr; ptr = malloc(15 * sizeof(*ptr)); /* a block of 15 integers */ if (ptr != NULL) { *(ptr + 5) = 480; /* assign 480 to sixth integer */ printf("Value of the 6th integer is %d",*(ptr + 5)); } }
출력:
Value of the 6th integer is 480
- 그것을주의해라 크기(*ptr) 대신에 사용되었습니다 크기(정수) 나중에 *ptr 선언이 다른 데이터 유형으로 형변환될 때 코드를 더 견고하게 만들기 위해.
- 메모리가 충분하지 않으면 할당이 실패할 수 있습니다. 이 경우 NULL 포인터를 반환합니다. 따라서 NULL 포인터를 확인하는 코드를 포함해야 합니다.
- 할당된 메모리는 연속적이며 배열로 처리할 수 있다는 점을 명심하세요. 대괄호 [ ]를 사용하는 대신 포인터 산술을 사용하여 배열 요소에 액세스할 수 있습니다. 증가 ++ 또는 +=를 사용하면 저장된 주소가 변경되므로 +를 사용하여 배열 요소를 참조하는 것이 좋습니다. 포인터.
Malloc() 함수는 문자 데이터 유형뿐만 아니라 구조체와 같은 복합 데이터 유형에도 사용할 수 있습니다.
C의 free() 함수
에 대한 기억 변수 컴파일 타임에 자동으로 할당이 해제됩니다. 동적 메모리 할당에서는 명시적으로 메모리 할당을 해제해야 합니다. 그렇지 않으면 메모리 부족 오류가 발생할 수 있습니다.
무료() 함수는 C에서 메모리를 해제/할당 해제하기 위해 호출됩니다. 프로그램에서 메모리를 해제하면 나중에 사용할 수 있는 메모리가 늘어납니다.
예 :
#include <stdio.h> int main() { int* ptr = malloc(10 * sizeof(*ptr)); if (ptr != NULL){ *(ptr + 2) = 50; printf("Value of the 2nd integer is %d",*(ptr + 2)); } free(ptr); }
출력:
Value of the 2nd integer is 50
C의 calloc() 함수
C calloc() 함수는 연속 할당을 의미합니다. 이 함수는 여러 블록의 메모리를 할당하는 데 사용됩니다. 배열 및 구조체와 같은 복잡한 데이터 구조에 메모리를 할당하는 데 사용되는 동적 메모리 할당 함수입니다.
Malloc() 함수는 단일 메모리 공간 블록을 할당하는 데 사용되는 반면 C의 calloc()은 여러 블록의 메모리 공간을 할당하는 데 사용됩니다. calloc() 함수에 의해 할당된 각 블록의 크기는 동일합니다.
calloc() 함수의 구문:
ptr = (cast_type *) calloc (n, size);
- 위의 명령문은 동일한 크기의 n개의 메모리 블록을 할당하는 데 사용됩니다.
- 메모리 공간이 할당된 후 모든 바이트는 XNUMX으로 초기화됩니다.
- 현재 할당된 메모리 공간의 첫 번째 바이트에 있는 포인터가 반환됩니다.
메모리 부족 등 메모리 공간 할당 오류가 발생할 때마다 널 포인터가 반환됩니다.
calloc()의 예:
아래 프로그램은 등차수열의 합을 계산합니다.
#include <stdio.h> int main() { int i, * ptr, sum = 0; ptr = calloc(10, sizeof(int)); if (ptr == NULL) { printf("Error! memory not allocated."); exit(0); } printf("Building and calculating the sequence sum of the first 10 terms \ n "); for (i = 0; i < 10; ++i) { * (ptr + i) = i; sum += * (ptr + i); } printf("Sum = %d", sum); free(ptr); return 0; }
결과 :
Building and calculating the sequence sum of the first 10 terms Sum = 45
calloc() 대 malloc(): 주요 차이점
다음은 다음의 주요 차이점입니다. malloc() 대 calloc() C에서 :
calloc() 함수는 일반적으로 malloc() 함수보다 더 적합하고 효율적입니다. 두 함수 모두 메모리 공간을 할당하는 데 사용되지만 calloc()는 한 번에 여러 블록을 할당할 수 있습니다. 매번 메모리 블록을 요청할 필요는 없습니다. calloc() 함수는 더 큰 메모리 공간이 필요한 복잡한 데이터 구조에서 사용됩니다.
C의 calloc()에 의해 할당된 메모리 블록은 항상 XNUMX으로 초기화되는 반면 C의 malloc() 함수에서는 항상 가비지 값을 포함합니다.
C의 realloc() 함수
C를 사용하여 진짜 할당() 기능을 사용하면 이미 할당된 메모리에 더 많은 메모리 크기를 추가할 수 있습니다. 원본 내용을 그대로 유지하면서 현재 블록을 확장합니다. C의 realloc()은 메모리 재할당을 의미합니다.
realloc()을 사용하여 이전에 할당된 메모리의 크기를 줄일 수도 있습니다.
realloc() 함수의 구문:
ptr = realloc (ptr,newsize);
위의 명령문은 newsize 변수에 지정된 크기의 새 메모리 공간을 할당합니다. 함수를 실행한 후 포인터는 메모리 블록의 첫 번째 바이트로 반환됩니다. 새 크기는 이전 메모리보다 크거나 작을 수 있습니다. 새로 할당된 블록이 이전 메모리 블록과 동일한 위치를 가리킬지 확신할 수 없습니다. 이 기능은 이전 데이터를 모두 새 지역에 복사합니다. 데이터가 안전하게 유지되도록 보장합니다.
realloc()의 예:
#include <stdio.h> int main () { char *ptr; ptr = (char *) malloc(10); strcpy(ptr, "Programming"); printf(" %s, Address = %u\n", ptr, ptr); ptr = (char *) realloc(ptr, 20); //ptr is reallocated with new size strcat(ptr, " In 'C'"); printf(" %s, Address = %u\n", ptr, ptr); free(ptr); return 0; }
C 언어에서 realloc()이 실패한 작업을 초래할 때마다 null 포인터를 반환하고, 이전 데이터도 해제됩니다.
C의 동적 배열
C의 동적 배열은 필요에 따라 요소의 수를 늘릴 수 있습니다. C 동적 배열은 컴퓨터 과학 알고리즘에서 널리 사용됩니다.
다음 프로그램에서는 동적 배열을 생성하고 크기를 조정했습니다. C
#include <stdio.h> int main() { int * arr_dynamic = NULL; int elements = 2, i; arr_dynamic = calloc(elements, sizeof(int)); //Array with 2 integer blocks for (i = 0; i < elements; i++) arr_dynamic[i] = i; for (i = 0; i < elements; i++) printf("arr_dynamic[%d]=%d\n", i, arr_dynamic[i]); elements = 4; arr_dynamic = realloc(arr_dynamic, elements * sizeof(int)); //reallocate 4 elements printf("After realloc\n"); for (i = 2; i < elements; i++) arr_dynamic[i] = i; for (i = 0; i < elements; i++) printf("arr_dynamic[%d]=%d\n", i, arr_dynamic[i]); free(arr_dynamic); }
화면의 C 동적 배열 프로그램 결과:
arr_dynamic[0]=0 arr_dynamic[1]=1 After realloc arr_dynamic[0]=0 arr_dynamic[1]=1 arr_dynamic[2]=2 arr_dynamic[3]=3
요약
- 힙에 필요에 따라 메모리 블록을 생성하여 메모리를 동적으로 관리할 수 있습니다.
- C 동적 메모리 할당에서는 메모리가 런타임에 할당됩니다.
- 동적 메모리 할당을 사용하면 크기가 유연하고 프로그램에서 언제든지 변경될 수 있는 문자열과 배열을 조작할 수 있습니다.
- 특정 구조가 얼마나 많은 메모리를 차지할지 모를 때 필요합니다.
- C의 Malloc()은 특정 크기의 메모리 블록이 가비지 값으로 초기화되는 메모리 할당을 나타내는 동적 메모리 할당 함수입니다.
- C의 Calloc()은 0으로 초기화된 시간에 여러 메모리 블록을 할당하는 연속 메모리 할당 함수입니다.
- C의 Realloc()은 지정된 크기에 따라 메모리를 재할당하는 데 사용됩니다.
- Free() 함수는 동적으로 할당된 메모리를 지우는 데 사용됩니다.