¿Por qué no () desasigna todas las ubicaciones de memoria asignadas?

No sé si estoy haciendo algo mal o si mi concepto está algo mal.

#include #include int main() { int *p; p=calloc(3,sizeof(int)); p[0]=10; p[1]=15; p[2]=30; printf("\n%d\n%p\n%d\n%p\n%d\n%p\n\n",p[0],p,p[1],p+1,p[2],p+2); free(p); //p=NULL; printf("\n%d\n%p\n%d\n%p\n%d\n%p\n\n",p[0],p,p[1],p+1,p[2],p+2); return 0; } 

Cuando se ejecuta el segundo, printf (), muestra p [2] = 30, mientras que p [0] = p [1] = 0 (en gcc ubuntu y algunos valores arbitrarios en las ventanas Code :: Blocks). Tengo 2 preguntas.

  1. Por qué free () libera los primeros 2 punteros y no el tercero. ¿uno?
  2. ¿Por qué los valores mostrados son 0 en ubuntu cuando parece correcto mostrar valores arbitrarios?

Soy un principiante, así que por favor tengan paciencia conmigo. He intentado lo mismo con malloc (), y sucede lo mismo.

El uso de memoria que ya ha sido free() -d invoca un comportamiento indefinido . No hagas eso

Citando C11 , anexo §J.2, Comportamiento indefinido

Se utiliza el valor de un puntero que se refiere al espacio desasignado por una llamada a la función free o realloc .

Para elaborar, llamar a free() en un puntero no establece el puntero en NULL o en cualquier otra cosa. Simplemente marca la memoria como reutilizable por el administrador de memoria. La ubicación de la memoria (puntero) ya no es válida para el progtwig, por lo que no debe usarla.

Como medida preventiva del problema anterior, se considera una buena práctica de encoding para establecer el puntero a NULL explícitamente después de llamar a free() . Sin embargo, FWIW, esto no es obligatorio .

Citando C11 , capítulo 7.22.3.3.

La función free hace que el espacio al que apunta ptr se desasigne, es decir, que esté disponible para una asignación adicional. […]

Además, solo para agregar, parcial free() no es posible llamando a free() , de todos modos. Puede consultar esta respuesta previa para aclarar .