utiliza uso sirve sintaxis resueltos que para memoria ejercicios dinamica como c arrays malloc

uso - sintaxis free en c



Cómo usar realloc en una función en C (3)

Ambos códigos son muy problemáticos, si usa el mismo puntero para enviar y recibir desde realloc, si falla, perderá su puntero para liberarlo más tarde.

Deberías hacer algo como esto:

{...

more = realloc(area , size); if( more == NULL ) free(area); else area=more;

...

}

Esta pregunta ya tiene una respuesta aquí:

Sobre la base de lo que aprendí aquí: la manipulación de matrices dinámicas a través de funciones en C.

void test(int data[]) { data[0] = 1; } int main(void) { int *data = malloc(4 * sizeof *data); test(data); return 0; }

Esto funciona bien. Sin embargo, también estoy tratando de usar realloc en una función.

void increase(int data[]) { data = realloc(data, 5 * sizeof *data); }

Esto cumple pero el programa se bloquea cuando se ejecuta.

Pregunta

¿Cómo debo usar realloc en una función?

Entiendo que debo asignar el resultado de realloc a una variable y verificar si es NULL primero. Este es solo un ejemplo simplificado.


Desea modificar el valor de un int* (su matriz), por lo que debe pasarle un puntero a su función de increase :

void increase(int** data) { *data = realloc(*data, 5 * sizeof int); }

El código de llamada se vería así:

int *data = malloc(4 * sizeof *data); /* do stuff with data */ increase(&data); /* more stuff */ free(data);


Tenga en cuenta la diferencia entre un puntero y una matriz.
Una matriz es un chuck de memoria en la pila, y eso es todo. Si tienes una matriz:

int arr[100];

Entonces arr es una dirección de memoria, pero también & arr es una dirección de memoria, y esa dirección de memoria es constante, no se almacena en ninguna ubicación. Por lo tanto, no puede decir arr = NULL, ya que arr no es una variable que apunta a algo. Es solo una dirección simbólica: la dirección donde comienza la matriz. En lugar de eso, el puntero tiene su propia memoria y puede apuntar a direcciones de memoria.

Es suficiente que cambies int [] a int *.
Además, las variables se pasan por copia, por lo que debe pasar un int ** a la función.

Sobre cómo usar realloc, todos los ejemplos didácticos incluyen esto:

  1. Use realloc;
  2. Compruebe si es NULL. En este caso, utilice perror y salga del programa;
  3. Si no es NULL use la memoria asignada;
  4. Libera la memoria cuando ya no la necesites.

Así que ese sería un buen ejemplo:

int* chuck= (int*) realloc (NULL, 10*sizeof(int)); // Acts like malloc, // casting is optional but I''d suggest it for readability assert(chuck); for(unsigned int i=0; i<10; i++) { chunk[i]=i*10; printf("%d",chunk[i]); } free(chunk);