الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة Segmentation fault مع الدالة realloc

بدأه SIFE في 24 أكتوبر 2010 · 2 رد · 536 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمة الله و بركاته

لدي هذا الكود:

.
.
.
  while(i<=nchunks)
   {
    if(i==nchunks)
     {
      nbytes=lbytes;
      buffer=(char *)realloc(buffer, nbytes);
     }
    else
     buffer = (char *)malloc(sizeof(char)*nbytes);
    //printf("%i-0x%X\n", i, buffer);
    out = (char*)malloc(sizeof(char)*strlen(fname)+3);
    memset(buffer, '\0', nbytes);
    memset(out, '\0', strlen(fname)+3);
.
.
.

المشكلة انه عند تحقق الشرط if(i==nchunks) تظهر لي رسالة Segmentation fault من سطر الأوامر، بعد تنقيح بال gdb وجدت التالي:

Program received signal SIGSEGV, Segmentation fault.
0x00000008006f100d in _pthread_mutex_init_calloc_cb () from /lib/libc.so.7

لست أستعمل thread في برنامجي، عند عمل backtrace ظهر التالي:

#0  0x00000008006f100d in _pthread_mutex_init_calloc_cb () from /lib/libc.so.7
#1  0x00000008006f4c77 in realloc () from /lib/libc.so.7
#2  0x00000008006f4bf9 in realloc () from /lib/libc.so.7
#3  0x00000008006f4ae1 in realloc () from /lib/libc.so.7
#4  0x0000000000400b1c in main () at test.c:26

أي أنه في السطر:

buffer=(char *)realloc(buffer, nbytes);

لا أفهم لماذا لايعيد مؤشر جديد ل buffer رغم أني أقوم بتحرير الذاكرة كل دورة في while.

''‏اللهم إني أسالك إيمانا دائما وأسألك قلبا خاشعا وأسألك علما ‏نافعا وأسألك يقينا صادقا وأسألك دينا قيما وأسألك العافية من كل ‏بلية''

'‏اللهم أغفر للمؤمنين و المؤمنات و المسلمين و المسلمات الأحياء ‏منهم و الأموات'

www.it-scoop.com

#2

رغم أني لا أستطيع الجزم بشيء من خلال قصاصة الكود التي وضعتها, إلا أن المشكلة حسب اعتقادي هي أنك تستخدم realloc لعمل exapand لمؤشر لا يشير إلى ذاكرة محجوزة لبرنامجك أصلاً, و قيمته لا تساوي NULL. فحسب قولك:

لا أفهم لماذا لايعيد مؤشر جديد ل buffer رغم أني أقوم بتحرير الذاكرة كل دورة في while.

لا أدري ماهي الحاجة إلى استخدام realloc في هذه الحالة, إن كنت تحرر الذاكرة في كل دورة. قم باستخدام malloc, و هذا كل شيء. الحل الآخر هو أن تقوم بإسناد NULL للمؤشر, حتى تعامله realloc مثل malloc أي تقوم بحجز ذاكرة جديدة, و لكن هذا الحل طريق طويل و الطريقة الأفضل هي استخدام malloc من الأساس.

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 24 أكتوبر 2010 في 23:00

2
#3

المشكلة كما قلت يا أخي خالد و الآن قمت بحلها.

''‏اللهم إني أسالك إيمانا دائما وأسألك قلبا خاشعا وأسألك علما ‏نافعا وأسألك يقينا صادقا وأسألك دينا قيما وأسألك العافية من كل ‏بلية''

'‏اللهم أغفر للمؤمنين و المؤمنات و المسلمين و المسلمات الأحياء ‏منهم و الأموات'

www.it-scoop.com

مواضيع مشابهة