تخطَّ إلى المحتوى

٣ يوليو ٢٠٢٦

حل خطأ Segmentation fault (core dumped) في C و C++ بالعربي

شارك المقال:

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.

📚 مصادر رسمية للتعمّق: freeCodeCamp — مصدر تعلّم البرمجة

الأسئلة الشائعة

ما معنى Segmentation fault؟

يعني أن برنامجك حاول الوصول إلى منطقة من الذاكرة لا يملك حقّ الوصول إليها — غالبًا عبر مؤشّر خاطئ أو تجاوز حدود مصفوفة. فيوقفه نظام التشغيل.

لماذا يظهر core dumped؟

core dumped تعني أن نظام التشغيل حفظ صورة من ذاكرة البرنامج لحظة الانهيار (ملف core) لتساعدك على التشخيص باستخدام مصحّح مثل gdb.

كيف أجد مكان الـ Segmentation fault؟

ترجم البرنامج بخيار -g ثم شغّله داخل gdb، وعند الانهيار اكتب backtrace لترى السطر الذي سبّب المشكلة بالضبط.

اقرأ أيضًا

تصفّح كل المقالات في المدوّنة، أو ابدأ التعلّم من المسارات و خرائط الطريق.