Namespaces
Variants

calloc

From cppreference.net
Definido en el encabezado <stdlib.h>
void * calloc ( size_t num, size_t size ) ;

Asigna memoria para un array de num objetos de size e inicializa todos los bytes en el almacenamiento asignado a cero.

Si la asignación tiene éxito, devuelve un puntero al byte más bajo (primero) en el bloque de memoria asignado que está adecuadamente alineado para cualquier tipo de objeto con alineamiento fundamental .

Si size es cero, el comportamiento está definido por la implementación (puede devolverse un puntero nulo, o puede devolverse algún puntero no nulo que no pueda utilizarse para acceder al almacenamiento).

calloc es seguro para hilos: se comporta como si solo accediera a las ubicaciones de memoria visibles a través de su argumento, y no a ningún almacenamiento estático.

Una llamada previa a free , free_sized , y free_aligned_sized (desde C23) o realloc que desasigna una región de memoria sincroniza-con una llamada a calloc que asigna la misma o una parte de la misma región de memoria. Esta sincronización ocurre después de cualquier acceso a la memoria por la función desasignadora y antes de cualquier acceso a la memoria por calloc . Existe un único orden total de todas las funciones de asignación y desasignación que operan sobre cada región particular de memoria.

(desde C11)

Contenidos

Parámetros

num - número de objetos
size - tamaño de cada objeto

Valor de retorno

En caso de éxito, devuelve el puntero al inicio de la memoria recién asignada. Para evitar una fuga de memoria, el puntero devuelto debe ser liberado con free() o realloc() .

En caso de fallo, devuelve un puntero nulo.

Notas

Debido a los requisitos de alineación, el número de bytes asignados no es necesariamente igual a num * size .

La inicialización a todos los bits en cero no garantiza que un número de punto flotante o un puntero se inicialicen a 0.0 y al valor de puntero nulo, respectivamente (aunque esto es cierto en todas las plataformas comunes).

Originalmente (en C89), se añadió soporte para tamaño cero para adaptarse a código como

OBJ* p = calloc(0, sizeof(OBJ)); // marcador de posición de "longitud cero"
...
while(1)
{
    p = realloc(p, c * sizeof(OBJ)); // reasignaciones hasta que el tamaño se estabilice
    ... // código que puede cambiar c o salir del bucle
}

Ejemplo

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int* p1 = calloc(4, sizeof(int));    // asigna y pone a cero un array de 4 int
    int* p2 = calloc(1, sizeof(int[4])); // igual, nombrando directamente el tipo de array
    int* p3 = calloc(4, sizeof *p3);     // igual, sin repetir el nombre del tipo
    if (p2)
    {
        for (int n = 0; n < 4; ++n) // imprime el array
            printf("p2[%d] == %d\n", n, p2[n]);
    }
    free(p1);
    free(p2);
    free(p3);
}

Salida:

p2[0] == 0
p2[1] == 0
p2[2] == 0
p2[3] == 0

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 7.22.3.2 La función calloc (p: TBD)
  • Estándar C17 (ISO/IEC 9899:2018):
  • 7.22.3.2 La función calloc (p: 253)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.22.3.2 La función calloc (p: 348)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.20.3.1 La función calloc (p: 313)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 4.10.3.1 La función calloc

Véase también