¿Diferencia entre malloc y realloc?

Supongamos que tengo dos ejemplos de código para crear una matriz entera de 10 elementos:

int *pi = (int*) 0xDEADBEEF; realloc(pi,10); 

y el otro es el que se escribe normalmente, es decir:

 int *pi; pi= malloc(10*sizeof(int)); 

Ahora, mi pregunta es: El primer tipo de asignación es legal pero no se utiliza. ¿Por qué, aunque allí puedo obtener la ubicación de inicio de mi elección? La inicialización de los punteros con constantes es legal pero no se utiliza. ¿Por qué?

Ahhhh, no! Esa primera llamada no es legal. No puedes pasar realloc algún puntero aleatorio y esperar lo mejor. El primer parámetro para realloc debe ser un puntero a la memoria que su progtwig fue asignado previamente (a través de algo como malloc , calloc o amigos) o un puntero nulo.

Cuando se pasa NULL , es equivalente a malloc . La llamada NULA puede ser útil si está reasignando en algún tipo de bucle y no quiere tener un caso especial la primera vez que asigna.


Mientras estamos en ello, las formas bastante estándar de usar malloc y realloc son:

 int* p; p = malloc(10 * sizeof(int)); //Note that there's no cast //(also, it could just be int* p = malloc(...);) int* np = realloc(p, 15 * sizeof(int)); //Note that you keep the old pointer -- this is in case the realloc fails 

Como un comentario tangencial: la historia es la razón principal por la que ve declaraciones y asignaciones en diferentes líneas. En versiones anteriores de C, las declaraciones tenían que aparecer primero en funciones. Eso significaba que incluso si su función no utilizaba una variable hasta 20 líneas, tenía que declarar en la parte superior.

Como normalmente no sabe cuál debería ser el valor de una variable que no se usa para otras 20 líneas, no siempre puede inicializarlo con nada significativo, por lo que queda una statement y ninguna asignación en la parte superior de su función.

En C99 / C11, no tiene que declarar variables en la parte superior de los ámbitos. De hecho, generalmente se sugiere definir las variables lo más cerca posible de su uso.

C requiere que el puntero pasado a realloc sea ​​un puntero obtenido de malloc , calloc o realloc call function (o un puntero nulo).

La primera asignación no es legal, ya que el puntero que pasa a realloc() debe haberse recibido previamente mediante una asignación de algún tipo. (Además, estás ignorando su valor de retorno, ¡algo que nunca debes hacer con las asignaciones!)

malloc() es crear un búfer para algo, de algún tamaño fijo. realloc() es devolver un búfer y obtener otro de un tamaño (presumiblemente) diferente, y podría devolverle el mismo búfer que estaba usando.