C 언어의 동적 메모리 관리 malloc, calloc, realloc 및 free 함수에 대한 설명

목차

1. 동적 메모리 관리가 존재하는 이유는 무엇입니까?

2. 동적 메모리 기능 소개:

1. 동적으로 열린 함수 - malloc 함수

1.1 함수 선언 및 함수:

1.2. 함수 사용 예:

2. 동적 공간 기능 없는 기능 출시

2.1. 무료 기능에 대한 참고 사항:

2.2. 무료 기능 사용 예:

3. 동적으로 열린 함수-calloc 함수

3.1 함수의 선언 및 기능:

3.2.함수 사용 예:

4. 동적 개발 기능-realloc(가장 중요하고 일반적으로 사용됨):

4.1. 참고:

4.2 함수 선언 및 함수:

4.3 함수 반환 값: 세 가지 상황이 있습니다.

4.4.함수 사용 예:


1. 동적 메모리 관리가 존재하는 이유는 무엇입니까?

이전에 메모리 공간을 신청하는 방법에는 두 가지가 있다는 것을 알고 있습니다. (변수 및 배열)

그러나 두 방법 모두 몇 가지 단점이 있습니다 .

①: 공간 개구부 크기가 고정되어 있습니다.

②: 배열을 선언할 때 배열의 길이를 지정해야 하며 필요한 메모리는 컴파일 타임에 할당됩니다.

그러나 공간 요구 사항으로 인해 위의 두 가지 상황뿐만 아니라 프로그램이 실행될 때까지 필요한 공간의 양을 알 수 없는 경우가 있으므로 배열을 컴파일하는 동안 공간을 여는 방법은 적절하지 않습니다.

배열 크기가 100인데 101개의 요소가 들어갈 수 없다고 가정하면 10개의 요소만 공간 낭비입니다.

따라서 지금은 동적 할당만 시도할 수 있습니다.

2. 동적 메모리 기능 소개:

1. 동적으로 열린 함수 - malloc 함수

1.1 함수 선언 및 함수:
void* malloc (size_t size);

①: 기능 기능: 메모리에서 사용 가능한 연속 공간을 적용하고 반환 값은 이 공간의 시작 주소입니다.

②: 함수 매개변수: 유형이 size_t 즉, 함수는 한 번에 space의 size 바이트에 대해 적용되지만 공간 내용을 초기화하지는 않습니다. size==0인 경우 malloc의 동작은 정의되지 않으며 다음에 따라 달라집니다. 컴파일러;

③: 반환 값은 void*이며, 반환 규칙은 다음과 같습니다.

④: 이 함수는 헤더 파일 <stdlib.h>에 포함되어 있습니다.

⑤: 동적 메모리 기능을 위한 응용 공간은 아래와 같이 힙 영역 에 적용됩니다.

1.2. 함수 사용 예:
#include<stdio.h>
#include<stdlib.h>

int main()
{
	//要什么类型的空间,就用什么类型的指针接收
	//注意函数返回值为void*,所以记住强制类型转换
	int* p = (int*)malloc(40);
	//判断申请空间是否成功
	if (p == NULL)
	{
		perror("malloc");//打印申请失败的原因
		return 1;
	}
    //使用空间
	int i = 0;
	for (i = 0; i < 4; i++)
	{
		p[i] = i;
		printf("%d ", p[i]);
	}
	return 0;
}

2. 동적 공간 기능 없는 기능 출시

참고: 이러한 동적으로 할당된 함수는 메모리 공간에 적용되며, 프로그램이 종료되면 운영체제로 반환되지만, 프로그램이 종료되지 않으면 동적으로 할당된 메모리는 자동으로 해제되지 않습니다. free()를 사용하여 해제해야 합니다.

2.1. 무료 기능에 대한 참고 사항:

①: 함수 선언:

void free (void* ptr);

②: 이 함수는 헤더 파일 <stdlib.h>에 포함되어 있습니다.

2.2. 무료 기능 사용 예:

이 함수를 사용하는 방법은 매우 간단하며 매개변수는 다음과 같이 동적으로 열린 변수만 있으면 됩니다.

여기서는 free 함수가 공간을 해제한 후에도 포인터 p의 값을 변경하지 않으므로 p는 여전히 이 공간을 가리키지만 공간은 해제되었으므로 p는 와일드 포인터라는 점에 주목할 가치가 있습니다. 이번에는 포인터가 비어 있습니다 .

3. 동적으로 열린 함수-calloc 함수

3.1 함수의 선언 및 기능:
void* calloc (size_t num, size_t size);

①: 함수의 기능: 이 함수는 size 크기 의 num 공간을 동적으로 열고 공간의 각 바이트를 0으로 초기화합니다.

② : 반환값은 malloc과 동일하며, 개발이 성공하면 이 공간의 시작주소를 반환하고, 개발에 실패하면 NULL을 반환한다.

③: malloc 함수와의 차이점은 공백의 각 바이트를 0으로 초기화한다는 점이다.

④:

3.2.함수 사용 예:

int main()
{
	//动态开辟五个整型大小的空间
	int* p = (int*)calloc(5, sizeof(int));
	//检查是否开辟成功
	if (p == NULL)
	{
		perror("calloc");
		return 1;
	}
	//使用空间
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", p[i]);
	}
	//释放空间
	free(p);
	p = NULL;
	return 0;
}

작업 결과:

4. 동적 개발 기능-realloc(가장 중요하고 일반적으로 사용됨):

4.1. 참고:

realloc 기능의 출현으로 동적 메모리 관리가 더욱 유연해졌습니다.

과거에 신청한 공간이 너무 작다고 느낄 때도 있고, 신청한 공간이 너무 크다고 느낄 때도 있는데, 메모리를 합리적으로 사용하기 위해 realloc 함수를 사용하여 메모리를 동적으로 열어줄 수 있습니다. 메모리 크기를 유연하게 조정할 수 있습니다.

4.2 함수 선언 및 함수:
void* realloc (void* ptr, size_t size);

①: 매개변수 소개:

첫 번째 매개변수 void*는 이전에 malloc, calloc, realloc 함수를 통해 열어두었던 크기 조정이 필요한 공간을 의미합니다.

두 번째 매개변수 size_t szie는 조정 후의 새 공간 크기(바이트)를 나타냅니다.

②: 첫 번째 매개변수 ptr이 널 포인터인 경우, 효과는 malloc과 동일합니다.

4.3 함수 반환 값: 세 가지 상황이 있습니다.

사례 1: str 뒤에 충분한 연속 공간이 있는 경우 반환 값은 str의 시작 공간입니다.

사례 2: str 뒤에 연속 공간이 충분하지 않으면 realloc 함수는 충분히 큰 새 공간을 찾아 이전 공간의 내용을 새 공간에 복사한 다음 이전 공간을 해제하고 마지막으로 시작 주소를 반환합니다. 새로운 공간 의 .

사례 3: 개발이 실패하고 NULL이 반환됩니다.

4.4.함수 사용 예:
int main()
{
	//先用malloc开辟5个整型的空间
	int* p = (int*)malloc(20);
	//检查malloc是否开辟成功
	if (p == NULL)
	{
		perror("malloc");
		return 1;
	}
	//开辟成功后,赋值1,2,3,4,5
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		p[i] = i + 1;
	}
	//用realloc扩容五个整形的空间,所以新空间为40字节
	//注意这里别用上面的指针p接收,
	//因为如果realloc开辟失败,就会返回空指针给指针p
	//指针p改变了,那么之前动态开辟的空间就找不到了,就会存在内存泄漏
	int* str =(int*) realloc(p, 40);
	//检查是否开辟成功
	if (str == NULL)
	{
		perror("realloc");
		return 1;
	}
	//开辟成功后再赋值给指针p,然后将str置零
	p = str;
	str = NULL;
	//检测是否将旧空间的数据拷贝到新空间
	for (i = 0; i < 5; i++)
	{
		printf("%d ", p[i]);
	}
    //释放
    free(p);
    p = NULL;
	return 0;
}

작업 결과:

이 지식은 여기서 끝나며, 동적 메모리에 대한 지식은 아직 끝나지 않았습니다. 계속됩니다!

추천

출처blog.csdn.net/hffh123/article/details/133324322