C 언어 - 동적 메모리 기능(malloc, calloc, realloc, free)

머리말:

C 언어에서 동적 메모리 기능은 중요한 지식 포인트입니다. 과거에는 고정된 양의 공간을 사용하여 열었습니다. 어레이를 컴파일한 후에는 계속해서 공간을 열 수 없었습니다. 열린 공간이 가득 차면 더 이상 공간을 열 수 없습니다(즉, , 더 이상 데이터를 추가할 수 없음). 이 글을 공부하면 메모리에서 공간을 신청하여 이 문제를 해결할 수 있으며, 공간이 가득 차면 계속 신청할 수 있습니다.

1. malloc 함수

헤더 파일이 필요합니다——<stdlib.h>
여기에 이미지 설명 삽입
브라우저 직접 번역:
여기에 이미지 설명 삽입
malloc 함수(동적 메모리 개발을 위한 함수):

void* malloc(size_t size);

기능:
이 기능은 메모리에서 연속적으로 사용 가능한 공간에 적용되며 이 공간에 대한 포인터를 반환합니다.

  • 할당에 성공하면 할당된 공간에 대한 포인터가 반환됩니다.
  • 열기에 실패하면 NULL 포인터가 반환되므로 malloc의 반환 값을 확인해야 합니다.
  • 반환값의 타입은 void*이므로 malloc함수는 열 공간의 타입을 알지 못하며 구체적인 용도는 사용자가 결정한다.
  • 크기가 0이면 컴파일러의 재량에 따라 malloc의 동작이 표준이거나 정의되지 않습니다.
  • malloc에 ​​의해 요청된 공간은 프로그램이 종료될 때 운영 체제로 반환되어야 하며, 프로그램이 종료되지 않으면 동적으로 요청된 메모리는 능동적으로 해제되지 않으며 free 함수로 해제해야 합니다.
    malloc이 요청한 메모리 공간:
    malloc이 공간을 신청한 후 공간의 내용을 초기화하지 않고 공간의 첫 번째 주소를 직접 반환합니다.
    예를 들어:
#include <stdio.h>
#include <stdlib.h>
int main()
{
    
    
//变长数组的知识点(vs不能用,gcc可以用)
    //int num = 0;
    //scanf("%d", &num);
    //int arr[num] = { 0 };
    int* ptr = NULL;
    ptr = (int*)malloc(40);
    if (ptr == NULL)//判断ptr指针是否为空
    {
    
    
        perror("malloc");
        exit; 
    }
    else
    {
    
    
        int i = 0;
        for (i = 0; i < 10; i++)//给开辟的空间赋值
            ptr[i] = i + 1;
    }
    free(ptr);//释放ptr指向的空间
    ptr = NULL;//让ptr指向空
    return 0;
}

둘, calloc 함수

헤더 파일이 필요합니다——<stdlib.h>
여기에 이미지 설명 삽입
브라우저 직접 번역:
여기에 이미지 설명 삽입
calloc 함수(동적 메모리 할당 함수):

void* calloc(size_t num, size_t size);

기능:

  • 함수의 기능은 size 크기의 num 요소에 대한 공간을 열고 공간의 각 바이트를 0으로 초기화하는 것입니다.
  • malloc 함수와의 차이점은 calloc 함수가 주소를 반환하기 전에 응용 프로그램 공간의 각 바이트를 0으로 초기화한다는 점입니다.
    예를 들면 다음과 같습니다.
#include <stdio.h>
#include <stdlib.h>
int main()
{
    
    
    int* p = (int*)calloc( 10,sizeof(int));
    if (p == NULL)//成立,开辟失败
    {
    
    
        perror("calloc");
        exit;
    }
    free(p);
    p = NULL;
    return 0;
}

p가 가리키는 주소:
여기에 이미지 설명 삽입

3, 재할당 기능

헤더 파일이 필요합니다——<stdlib.h>
여기에 이미지 설명 삽입
브라우저 직접 번역:
여기에 이미지 설명 삽입
realloc 기능(보다 유연한 동적 메모리 관리):
때때로 우리는 과거에 적용한 공간이 너무 작다는 것을 발견하고 때로는 우리가 적용한 공간이 과거에는 너무 컸기 때문에 메모리를 사용하려면 메모리 크기를 유연하게 조정해야 합니다. realloc 함수는 동적으로 할당된 메모리의 크기를 조정할 수 있습니다.

void* realloc(void* ptr, size_t size);

기능:

  • ptr은 조정할 메모리 주소입니다.
  • size는 새로 조정된 크기입니다.
  • 반환 값은 조정된 메모리 시작 위치입니다.
  • 이 기능은 원본 공간의 크기 조정을 기반으로 원본 데이터도 새 공간으로 이동합니다.
    참고:
    realloc이 메모리 공간을 조정하는 두 가지 상황이 있습니다.
    • 사례 1: 원래 공간 뒤에 충분한 공간이 있습니다( 내부 확장 ).
      Case 1일 때 메모리를 확장하고 싶다면 원래 메모리 바로 뒤에 공간을 추가하면 원래 공간의 데이터가 변경되지 않습니다.
      여기에 이미지 설명 삽입

    • 상황 2: 원래 공간 뒤에 충분한 공간이 없습니다(원격 확장).
      Case 2에서 원래 공간 뒤에 공간이 충분하지 않은 경우 확장 방법은 사용할 힙 공간에서 적절한 크기의 연속적인 다른 공간을 찾는 것입니다. 이 함수는 새 메모리 주소를 반환합니다.
      여기에 이미지 설명 삽입
      따라서 realloc 기능을 사용할 때 주의를 기울여야 합니다.
      1. 새 공간을 엽니다.
      2. 이전 공간 데이터가 새 공간으로 복사됩니다.
      3. 오래된 공간을 확보하십시오.
      4. 새 공간의 시작 주소를 반환합니다.
      예를 들어:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    
    
    int* ptr =(int*) malloc( 100 );
    if (ptr != NULL)
    {
    
    
//可以使用这个空间
    }
    else
    {
    
    
        perror("malloc");
        exit;
    }
    //扩展空间
    int* p = (int*)realloc(ptr, 1000);//可能增容失败
    if (p != NULL)
    {
    
    
        //增容成功
        ptr = p;//p指向的空间交给ptr去维护
    }
    free(ptr);//把开辟早堆上的空间释放掉
    ptr = NULL;
    return 0;
}

네, 무료 기능

헤더 파일이 필요합니다——<stdlib.h>
여기에 이미지 설명 삽입
브라우저 직접 번역:
여기에 이미지 설명 삽입
무료 기능(동적으로 할당된 메모리 해제):

void* free(void* ptr);

기능:

  • ptr 매개변수가 가리키는 공간이 동적으로 열리지 않으면 free 함수의 동작이 정의되지 않습니다.
  • 매개 변수 ptr이 NULL 포인터이면 함수는 아무 작업도 수행하지 않습니다.

Guess you like

Origin blog.csdn.net/plj521/article/details/132264625