9.2.2 Asignación de memoria dinámica
En C99, puede usar variables para definir el tamaño de la matriz, pero antes de C99 la gente usaba la asignación de memoria dinámica :
función malloc
malloc(size_t size); El tipo devuelto es void* (porque el tipo no se puede transferir), lo que requiere una conversión de tipo adicional.
Para utilizar esta función, debe incluir el archivo de encabezado <stdlib.h>
El tamaño del espacio solicitado a malloc está en bytes . ¿Cuánto solicitar? Escriba la cantidad *sizeof entre paréntesis (tipo obligatorio int/short/double)
a=(int*)malloc(number*sizeof(int));
//Debido a que malloc devuelve void* por defecto, (int*) es una conversión de tipo
Para liberar el espacio aplicado después de su uso, use la función free()
El resultado devuelto es nulo *, que debe convertirse al tipo que necesita (el tipo es el tipo de valor definido artificialmente)
por ejemplo: para solicitar el número n, tipo int, devuelva el espacio de tipo int* a una variable de puntero a
int *a; a=(int*)malloc(n*tamañode(int));
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int number;
int *a;
int i;
printf("请输入变量:");
scanf("%d",&number);
//C99可以直接写 int a[number];
a=(int*)malloc(number*sizeof(int));
//读入数据
for(i=0;i<number;i++)
{
scanf("%d",&a[i]);
}
//倒序输出(从下标-1即最大值开始输出)
for(i=number-1;i>=0;i--)
{
printf("%d",a[i]);
}
free(a);//申请了一块空间,现在需要释放。程序将指针当作数组用,所以直接释放a即可
return 0;
}
La solicitud falló
Si la solicitud de memoria falla, se devolverá 0 (o NULL).
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
void *p;
int cnt=0;
while((p=malloc(100*1024*1024)))//每次申请100M的空间 交给p
//malloc(100*1024*1024)
//(p=malloc(100*1024*1024)) 看malloc的结果是不是0,是1的话while就执行
{
cnt++;
}
printf("分配了%d00MB的空间\n",cnt);//14600
return 0;
}
while((p=malloc(100*1024*1024)))
Esta declaración hace dos cosas al mismo tiempo. Primero: solicitar 100 MB de espacio para p; segundo: usar el valor p como condición while
para que la aplicación falle, es decir, el ciclo se detiene cuando no hay espacio para solicitar y se puede obtener el valor máximo de memoria asignable del sistema.
gratis()
Como dice el refrán, si pides prestado algo debes devolverlo, no es difícil volver a pedir prestado, la función de la función gratuita es devolver el espacio de memoria prestado al sistema.
¡Solo puedes devolver la primera dirección del espacio que solicitaste! ! ! //p++ no puede ser libre
¡El espacio que ha solicitado eventualmente deberá devolverse intacto!
gratis (NULO);
No hay ningún problema, es como no hacer nada.
O forme un hábito: al definir un puntero, primero asigne un valor de 0 al puntero. Si no hay ninguna aplicación o la aplicación falla, entonces free(NULL,free(0)
problema comun
Solicité pero no obtuve gratis
La consecuencia es que la memoria irá disminuyendo gradualmente durante un largo período de tiempo.
Los novatos pueden haberlo olvidado
Es posible que las personas avanzadas no puedan encontrar el momento adecuado de forma gratuita.
gratis muchas veces
se estrellará
Directamente gratis después del cambio de dirección
Por ejemplo, si solicita el puntero p, ejecutar free (p++) le indicará que la variable señalada por p++ no ha sido asignada.
Por lo tanto, un malloc debe coincidir con un free. Se requiere cierta planificación de la estructura del programa, así como algo de experiencia.