Explicación detallada de las funciones de gestión de memoria malloc, calloc, realloc

1. malloc

Cuando queremos abrir un espacio de memoria dinámica, necesitamos usar funciones de memoria dinámica, como

char* p;

Cuando queremos usar la memoria bajo la dirección p, necesitamos usar la función malloc

void* malloc(size_t size);

Tenga en cuenta que el tipo de retorno de la función malloc es (void*), y el parámetro formal es el número de bytes para abrir espacio. Entonces, para usar la función malloc, debe convertir el valor de retorno al tipo deseado, como

char* p1=(char*)malloc(10);//在p1这个地址下开辟10个字节空间,可以存放10个char型数据
int* p2=(int*)malloc(20);//在p2这个地址下开辟20个字节空间,可以存放5个int型数据

 Tenga en cuenta que la función malloc a veces no puede abrir espacio en la memoria y devuelve un puntero nulo ( NULL ) en este momento. Por lo tanto, para usar mejor la función malloc, también debe verificar si la memoria se abrió con éxito. El código es el siguiente

int* p=(int*)malloc(20);//开辟内存空间
if(p==NULL)
{
    printf("%s",strerror(errno));//打印开辟失败的原因
}

Lo que necesita saber es que el espacio de memoria abierto por la función malloc no se inicializará automáticamente y los valores aleatorios se colocarán en él.

	int* p = (int*)malloc(20);//开辟内存空间
	if (p == NULL)
	{
		printf("%s", strerror(errno));//打印开辟失败的原因
	}
	else
	for (int i = 0; i <5 ; i++)//访问新开辟的内存
	{
		printf("%d", (int)*(p + i));
	}

El resultado es el siguiente

 

 La función malloc está terminada, pero hay un punto muy importante que no se ha mencionado. Sabemos que crear una matriz es equivalente a solicitar un espacio continuo en el espacio de memoria. El espacio de memoria solicitado por la matriz está en la pila. Cuando la matriz abandone el ámbito, se destruirá automáticamente y se liberará la memoria. .

Sin embargo, el espacio de memoria solicitado por la función malloc aquí está en el montón, y el alcance no se destruirá. La memoria debe liberarse manualmente, de lo contrario, ¡provocará una pérdida de memoria! (Incluso si el sistema operativo recuperará automáticamente la memoria después de salir del programa, sigue siendo un buen hábito liberarla manualmente)

Para liberar memoria manualmente, debe usar la función libre. La función libre liberará la memoria asignada y la primera dirección de la memoria se convertirá en un puntero salvaje, por lo que la primera dirección debe establecerse en NULL. el código se muestra a continuación

int* p = (int*)malloc(20);//开辟内存空间
	if (p == NULL)
	{
		printf("%s", strerror(errno));//打印开辟失败的原因
	}
    //使用

    //手动释放空间
	free(p);
	p = NULL;

 2.calloc

A diferencia de malloc, la función calloc inicializará automáticamente el espacio de memoria recién abierto a todos 0

void* calloc(size_t num,size_t size);

size_t num: el número de desarrollo

size_t size: el tamaño del tipo desarrollado

Por ejemplo, abra 5 espacios enteros

#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<stdio.h>
int main()
{
	int* p = (int*)calloc(5,4);//开辟内存空间
	if (p == NULL)
	{
		printf("%s", strerror(errno));//打印开辟失败的原因
	}
	else
		//使用

	free(p);
	p = NULL;
	return 0;
}

3.realizar

La función de reasignación se utiliza para abrir un espacio más grande cuando el espacio original es insuficiente

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

void* ptr: la primera dirección del espacio original

size_t size: nuevo tamaño de bytes de espacio

La función realloc encontrará dos situaciones al abrir un nuevo espacio

  1. Hay suficiente espacio detrás del espacio original, y se abrirá un nuevo espacio detrás del espacio original, y la dirección devuelta es la misma que la dirección original.
  2. Espacio insuficiente detrás del espacio original:
  • realloc encontrará un espacio más grande
  • Copie los datos originales al nuevo espacio
  • liberar espacio antiguo
  • Devuelve la dirección del nuevo espacio (diferente a la dirección original)
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<stdio.h>
int main()
{
	int* p = (int*)calloc(5,4);//开辟内存空间
	if (p == NULL)
	{
		printf("%s", strerror(errno));//打印开辟失败的原因
	}
	else
		//使用
		for (int i = 0; i < 5; i++)
		{
			printf("%d ", *(p + i));
		}
	p=realloc(p, 40);//扩大内存空间,将20字节增到40字节
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", *(p + i));
	}
	free(p);
	p = NULL;
	return 0;
}

 

 

Supongo que te gusta

Origin blog.csdn.net/2301_76144863/article/details/129979308
Recomendado
Clasificación