Segmentation fault (lỗi phân đoạn) xảy ra khi chương trình truy cập vùng nhớ không được phép: chưa khởi tạo, vượt giới hạn, hoặc ghi vào vùng chỉ đọc. Dưới đây là các nguyên nhân phổ biến:
- Truy cập mảng vượt giới hạn — đọc/ghi chỉ số
< 0hoặc>= size. - Giải tham chiếu con trỏ NULL — dùng con trỏ chưa gán địa chỉ hợp lệ.
- Giải tham chiếu bộ nhớ đã giải phóng — dùng con trỏ sau
free()(dangling pointer). - Giải tham chiếu con trỏ chưa khởi tạo — con trỏ chứa giá trị rác.
- Sai toán tử & (lấy địa chỉ) và * (giải tham chiếu) — nhầm lẫn khi truyền tham số.
- Định dạng sai trong printf/scanf — specifier không khớp kiểu đối số (vd:
%dchofloat). - Tràn ngăn xếp (Stack overflow) — đệ quy quá sâu, mảng cục bộ quá lớn.
- Ghi vào bộ nhớ chỉ đọc — sửa chuỗi literal (
char *s = "abc"; s[0] = 'x';), hoặc section.text.
Cách debug: Dùng gdb (chạy với -g), valgrind, AddressSanitizer (-fsanitize=address), bật cảnh báo trình biên dịch (-Wall -Wextra).