산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

malloc(), calloc() 함수를 사용한 C의 동적 메모리 할당

C 동적 메모리 할당을 배우기 전에 다음을 이해합시다.

C에서 메모리 관리는 어떻게 작동합니까?

기본 데이터 유형을 사용하여 변수를 선언하면 C 컴파일러는 스택이라는 메모리 풀에서 변수에 대한 메모리 공간을 자동으로 할당합니다. .

예를 들어, float 변수는 선언될 때 일반적으로 플랫폼에 따라 4바이트를 사용합니다. sizeof 를 사용하여 이 정보를 확인할 수 있습니다. 아래 예와 같은 연산자

#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() 요청된 크기의 메모리를 할당하고
할당된 공간.calloc()의 첫 번째 바이트에 대한 포인터를 반환합니다. 배열 요소를 위한 공간을 할당합니다. 요소를 0으로 초기화하고 메모리에 대한 포인터를 반환합니다.realloc() 이전에 할당된 메모리 공간의 크기를 수정하는 데 사용됩니다.Free() 이전에 할당된 메모리 공간을 해제하거나 비웁니다.

위의 기능을 응용 프로그램과 함께 논의합시다.

C의 malloc() 함수

C malloc() 함수는 메모리 할당을 나타냅니다. 메모리 블록을 동적으로 할당하는 데 사용되는 함수입니다. 지정된 크기의 메모리 공간을 예약하고 메모리 위치를 가리키는 널 포인터를 반환합니다. 반환된 포인터는 일반적으로 void 유형입니다. C malloc() 함수를 모든 포인터에 할당할 수 있음을 의미합니다.

malloc() 함수의 구문:

ptr = (cast_type *) 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

  1. sizeof(*ptr) sizeof(int) 대신 사용됨 *ptr 선언이 나중에 다른 데이터 유형으로 유형 변환될 때 코드를 더 강력하게 만들기 위해.
  2. 메모리가 충분하지 않으면 할당이 실패할 수 있습니다. 이 경우 NULL 포인터를 반환합니다. 따라서 NULL 포인터를 확인하는 코드를 포함해야 합니다.
  3. 할당된 메모리는 연속적이며 배열로 처리될 수 있습니다. 대괄호 [ ]를 사용하는 대신 포인터 산술을 사용하여 배열 요소에 액세스할 수 있습니다. 증분 ++ 또는 +=를 사용하면 포인터가 저장한 주소가 변경되기 때문에 +를 사용하여 배열 요소를 참조하는 것이 좋습니다.

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);

메모리 부족과 같은 메모리 공간 할당 오류가 발생할 때마다 null 포인터가 반환됩니다.

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():주요 차이점

다음은 C에서 malloc()과 calloc()의 주요 차이점입니다.

calloc() 함수는 일반적으로 malloc() 함수보다 더 적합하고 효율적입니다. 두 함수 모두 메모리 공간을 할당하는 데 사용되지만 calloc()은 한 번에 여러 블록을 할당할 수 있습니다. 매번 메모리 블록을 요청할 필요가 없습니다. calloc() 함수는 더 큰 메모리 공간이 필요한 복잡한 데이터 구조에서 사용됩니다.

C의 calloc()에 의해 할당된 메모리 블록은 항상 0으로 초기화되는 반면 C의 malloc() 함수에서는 항상 쓰레기 값을 포함합니다.

C의 realloc() 함수

C realloc() 사용 기능을 사용하면 이미 할당된 메모리에 더 많은 메모리 크기를 추가할 수 있습니다. 원래 내용을 그대로 두면서 현재 블록을 확장합니다. 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 언어

  1. 읽기 전용 메모리(ROM)
  2. C# 기본 입력 및 출력
  3. C# 사용
  4. C++ 메모리 관리:신규 및 삭제
  5. C 프로그래밍의 사용자 정의 함수 유형
  6. C 동적 메모리 할당
  7. C 표준 라이브러리 함수
  8. 예제를 사용한 C++ 배열 동적 할당
  9. 프로그램 예제가 있는 C++ 함수
  10. C - 기능