Segmentation fault (core dumped) من أكثر أخطاء C و
C++ إحباطًا، لأنه لا يخبرك بالسطر مباشرةً. لكن سببه دائمًا واحد:
وصولٌ غير مشروع إلى الذاكرة. لنفهمه ونحلّه.
ما معنى الخطأ؟
يقسّم نظام التشغيل الذاكرة إلى أجزاء (segments) لكل برنامج. حين يحاول برنامجك القراءة أو الكتابة خارج ما يملكه، يوقفه النظام فورًا ويطبع:
Segmentation fault (core dumped)
الكلمة المفتاحية: مؤشّر يشير إلى مكان خاطئ.
الأسباب الخمسة الأكثر شيوعًا
1) مؤشّر فارغ (NULL) أو غير مهيّأ
int *p = NULL;
*p = 5; // ❌ الكتابة عبر مؤشّر فارغ
الحل: لا تستخدم مؤشّرًا قبل أن يشير إلى ذاكرة صالحة، وتحقّق منه:
if (p != NULL) *p = 5;
2) تجاوز حدود المصفوفة
int arr[3];
arr[5] = 10; // ❌ خارج الحدود
الحل: احترم الحدّ (0 إلى size - 1) دائمًا.
3) استخدام ذاكرة بعد تحريرها (use-after-free)
free(p);
*p = 3; // ❌ p صار مؤشّرًا معلّقًا
الحل: بعد free اجعل المؤشّر NULL: free(p); p = NULL;.
4) التكرار اللانهائي (Stack overflow)
دالة تستدعي نفسها بلا شرط توقّف تملأ المكدّس حتى ينهار.
5) الكتابة في نصّ ثابت
char *s = "مرحبا";
s[0] = 'M'; // ❌ النصوص الحرفية للقراءة فقط
كيف تجد السطر المسؤول؟ (gdb)
هذه أهمّ خطوة عملية. ترجم بمعلومات التصحيح ثم استخدم gdb:
gcc -g program.c -o program
gdb ./program
run
# بعد الانهيار:
backtrace
سيعرض backtrace سلسلة الاستدعاءات وصولًا للسطر الذي سبّب الانهيار.
💡 أداة أقوى للتسرّبات والوصول الخاطئ:
valgrind ./program— تكشف بالضبط أين ولماذا لمست ذاكرة غير صالحة.
جدول التشخيص السريع
| العرَض | السبب المرجّح | الحل |
|---|---|---|
| ينهار عند مؤشّر | NULL / غير مهيّأ | هيّئ وتحقّق |
| ينهار في حلقة | تجاوز حدود مصفوفة | راجع الفهارس |
| ينهار بعد free | مؤشّر معلّق | اجعله NULL |
| ينهار فورًا وبعمق | تكرار لانهائي | أضف شرط توقّف |
الخلاصة
Segmentation fault = لمستَ ذاكرة ليست لك. راجع مؤشّراتك وحدود مصفوفاتك،
واجعل المؤشّر NULL بعد free، واستعن بـ gdb وvalgrind لتحديد الموقع بدقّة
بدل التخمين.
تعمّق في المؤشّرات والذاكرة في C++ أو ابدأ أساسيات C.