una tipos segmentacion producto mercado importancia empresa ejemplos ejemplo consumo clientes c free segmentation-fault

tipos - Fallo de segmentación después de libre(), ¿cuáles son las causas más comunes de esto?



variables de segmentacion de mercado (7)

Recibo un error de segmentación después de free cierto puntero:

free(studentDB->name);

Puedo obtener su valor sin ningún error o advertencia:

printf("[DBG] studentDB->name: %s/n", studentDB->name);

Sin embargo, como dije, el programa se bloquea cuando intento liberarlo. ¿Cuáles son las causas más comunes para un comando free conduce a una falla de segmentación?


¿ studentDB->name asignado previamente el studentDB->name ? Si no asignó memoria para ese campo, lo más probable es que cuando llame free , ¡termine con seg-fault! Verifique en ese campo y asegúrese de que sea malloc d o strdup d.

O que hay una corrupción en otro lugar en el montón, que coincidió con esto, ya que con razón señaló que puede ver el valor del name ...

Espero que esto ayude, Saludos, Tom.


De la página de manual:

free (ptr) libera el espacio de memoria apuntado por ptr, que debe haber sido devuelto por una llamada previa a malloc (), calloc () o realloc (). De lo contrario, o si ya se ha llamado antes a (ptr), se produce un comportamiento no definido. Si ptr es NULL, no se realiza ninguna operación.

Uno también puede verificar:

  1. ¿StudentDB es un puntero no nulo de una clase / estructura que contiene un "nombre" de miembro?
  2. ¿El espacio apuntado por studentDB-> name fue devuelto por malloc / calloc / realloc?

Por lo general, acumula corrupción en otro lugar del programa. El montón generalmente es continuo y el administrador de montón rodea bloques de montón con encabezados para rastrear los bloques: si sobrescribe el encabezado del bloque, el acceso a él es correcto, pero es más probable que falle.


Probablemente ya lo hayas liberado () ''ed o ya sobrescrito la información malloc que precede al bloque con un desbordamiento del búfer


Si no lo hizo malloc() , no puede free() . ¿De dónde studentDB->name ?


También podría ser que acceder al nombre del puntero studentDB es una segfault si studentDB es NULL.


Una segfault from free puede ser causada al llamarlo a un puntero que no estaba asignado con malloc , o que ya se había free .

studentDB->name si publicaras el código donde se studentDB->name .