¿Qué es el Error 'Segmentation Fault' en C?
El error Segmentation Fault (a menudo abreviado como segfault) ocurre cuando un programa intenta acceder a una zona de memoria que no le pertenece o para la cual no tiene permisos de lectura o escritura. Es una medida de protección del sistema operativo para evitar la corrupción de datos críticos.
Causas Principales del Segmentation Fault
- Acceso a punteros no inicializados (punteros salvajes).
- Desbordamiento de búfer (buffer overflow) al superar los límites de un array.
- Intento de modificar memoria de solo lectura (como literales de cadena).
- Desreferenciación de punteros nulos (
NULL). - Problemas de recursión infinita que agotan la pila (stack overflow).
Método 1: Usar GDB (GNU Debugger) para encontrar la línea exacta del error
El depurador GDB es la herramienta estándar en sistemas Unix/Linux para rastrear dónde se produce la falla de segmentación.
- Compila tu código fuente incluyendo las banderas de depuración
-g:gcc -g programa.c -o programa - Ejecuta el programa dentro de GDB:
gdb ./programa - Escribe el comando
runy presiona Enter para iniciar la ejecución:(gdb) run - Cuando ocurra el fallo, GDB te mostrará exactamente la línea de código donde falló. Escribe
backtrace(obt) para ver la pila de llamadas:(gdb) bt
Método 2: Verificar la inicialización y límites de punteros y arrays
Una causa muy común es asignar memoria incorrectamente o usar mal los índices. Analiza el siguiente ejemplo erróneo:
int *ptr = NULL; *ptr = 10; // Causa un Segmentation Fault inmediato
Para solucionarlo, asegúrate de reservar memoria dinámica correctamente con malloc o asignar una dirección válida antes de usar el puntero:
- Verifica siempre que el puntero no sea
NULLantes de desreferenciarlo:if (ptr != NULL) { *ptr = 10; } - Libera la memoria adecuadamente y evita usar punteros colgantes (dangling pointers):
free(ptr); ptr = NULL;
Método 3: Utilizar Valgrind para detectar fugas y accesos inválidos
Valgrind es una herramienta excelente para analizar el uso dinámico de la memoria.
- Ejecuta tu programa analizado por Valgrind con el siguiente comando:
valgrind --leak-check=full ./programa - Revisa la salida en busca de mensajes como Invalid read o Invalid write, los cuales indican claramente dónde se está accediendo a memoria prohibida.