C Language_0311 Notes_Pointers: Memoria dinámica (antes de C99) cambio de tamaño de matriz asignación de memoria dinámica/libre después de malloc/notes

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.

Supongo que te gusta

Origin blog.csdn.net/Shmily_as33/article/details/129464224
Recomendado
Clasificación