Saltar al contenido principal
LibreTexts Español

12.3: Asignación de memoria

  • Page ID
    82155
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)\(\newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    Para usar las rutinas de memoria, incluye el encabezado stdlib.h en tu código y asegúrate de vincularte con la biblioteca estándar. Hay dos funciones principales de asignación de memoria. Son malloc () y calloc (). Aquí están sus prototipos:

    void * malloc( unsigned int size );
    void * calloc( unsigned int num_item, unsigned int item_size );
    

    malloc () toma un solo argumento: El número de bytes que desea asignar del pool libre. calloc () toma dos argumentos: El número de elementos que desea encajar en el bloque de memoria y su tamaño en bytes. Básicamente, calloc () solo llama a malloc () después de multiplicar los dos argumentos juntos. Se utiliza para mayor comodidad. Ambas funciones devuelven un puntero a un tipo void. ¿Qué es esto? Un puntero vacío se puede considerar como un puntero genérico, de talla única para todos. Evita posibles choques de tamaño tipo. Puede asignar un puntero vacío a otro tipo de puntero y no obtener una discrepancia de tipo. Si no se puede hacer la solicitud de memoria (no hay suficiente memoria) entonces las funciones devolverán NULL. ¡Siempre verifique la devolución NULL! ¡Nunca asumas que la asignación va a funcionar!

    Si quieres obtener espacio para 100 bytes, harías algo como esto:

    char *cp;
    
    cp = malloc( 100 );
    if( cp )
    {
        /* memory allocated, do stuff... */
    } else
    {
        /* not allocated, warn user and fail gracefully... */
    }
    

    Si necesitas espacio para 200 dobles, harías algo como esto:

    double *dp;
    
    if( dp = calloc( 200, sizeof(double) ) ) /* assign and if test in 1 */
    {
        /* memory allocated, do stuff... */
    }
    else {
        /* not allocated, warn user and fail gracefully... */
    }
    

    Tenga en cuenta el uso del operador sizeof () anterior. Si tuvieras una estructura y necesitabas crear una (por ejemplo, para agregarla a una lista enlazada), podrías hacer esto:

    struct foo *fp;
    
    if( fp = calloc( 1, sizeof(struct foo) ) )
    {
        /* remainder as above ... */
    

    This page titled 12.3: Asignación de memoria is shared under a CC BY-NC-SA 4.0 license and was authored, remixed, and/or curated by James M. Fiore via source content that was edited to the style and standards of the LibreTexts platform; a detailed edit history is available upon request.