with significado pointer functions dogs array arithmetic c pointers

significado - cómo funciona ''libre'' cuando se incrementa el puntero



pointers significado (9)

Causará un comportamiento indefinido. Lo más probable es que bloquee su programa al instante o más tarde.

Cuando se llama a malloc, el tamaño se almacena junto al bloque asignado para que el usuario sepa cuánto puede liberar, etc. ( http://c-faq.com/malloc/freesize.html ).

Mi pregunta es, digamos que hemos asignado memoria dinámicamente y más adelante en el código incrementamos el puntero

pointer++

Y luego, si llamo a un

free(pointer)

¿Qué memoria realmente se libera?

Es el número de bytes asignados que comienzan desde la dirección actual señalada por ''puntero'' o desde la dirección base a la que se ha asignado.


Debe free() el mismo puntero que recibió de malloc() . Incrementar, alterar o cambiarlo es un comportamiento indefinido, que suele ser un fallo de segmentación.

Piense en el puntero que recibe como un libro de una biblioteca. Llegas a casa y lo lees. Después, retira la página de inicio y la parte posterior del libro y se la entrega al bibliotecario. ¿Lo aceptará o estás en serios problemas ahora? ;-)


El código que administra el almacenamiento gratuito solo asume que no se le entregaría el puntero equivocado. Toma todo lo que das, no comprueba su plausibilidad, y lo interpreta de la misma manera que interpretaría el puntero correcto. Actuará de acuerdo con los valores que lea de las ubicaciones de memoria que considere, suponiendo que el puntero se haya obtenido correctamente. Si le entregó un puntero perdido, encontrará valores sin sentido y por lo tanto actuará sin sentido.

Esto se llama comportamiento indefinido y es algo malo. Puede formatear su disco duro, brindar por su CPU o hacer que su programa funcione de la manera que se espera hasta que se retire. Nunca sabes.


El puntero devuelto por malloc () apunta directamente a la memoria en el montón que será utilizado por su programa.

Sin embargo, esta no es la única memoria que está asignada. Algunos bytes se asignan en las ubicaciones de memoria inmediatamente anteriores al puntero devuelto que indica el tamaño del fragmento en el montón. Esto no lo utiliza su programa, pero definitivamente será necesario de forma gratuita.

Cuando se llama a free (p), la información sobre su fragmento en el montón está contenida en, digamos, las ubicaciones desde p-4 hasta p-1. Esto depende de la implementación, por supuesto, pero los detalles no tienen que ver con el programador. Lo único que el programador necesita saber es que free usa esa área de memoria para liberar la porción de memoria del montón, y esa área se deriva del puntero original p.

En otras palabras, si llama gratis en p, solo tendrá sentido si malloc una vez devolvió exactamente p.

Si pasa un puntero que no fue creado con malloc, ¿quién sabe lo que estará en p-1, p-2, etc.? Es probable que resulte en un fracaso catastrófico.


Eso es un comportamiento indefinido. Y lo más probable es que resulte en un problema más adelante.


Esto es lo que llamamos un error de pérdida / segmentación de memoria.

TIENE QUE pasar el mismo valor de puntero a free () como el que obtuvo de malloc () o su aplicación se portará mal.


Si incrementa el puntero sin guardar la ubicación original, no puede llamar gratis. Debe guardar la ubicación original en algún lugar y usar un punto temporal cuando incremente.


Solo puede llamar a free() en un valor que haya obtenido previamente de malloc() , calloc() o realloc() (o NULL ). Todo lo demás está indefinido.

Por ejemplo, una implementación puede almacenar el tamaño del bloque asignado en 4 bytes antes de la dirección de retorno de malloc() . Luego, free() retrocede 4 bytes y descubre el tamaño. Esto no funcionaría si no pasas el puntero original de nuevo a free() .


hacer pointer++ al puntero original es terriblemente mal. El resultado de su liberación puede ser diferente en diferentes implementaciones, pero definitivamente no debería hacerlo.