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

struct and malloc ?

مغلق
بدأه Teao في 17 ديسمبر 2004 · 6 رد · 595 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

ارجو أن تساعدوني على فهم الدرس التالي:

هنا

انا فهمت struct و malloc ولم افهم الربط بينهما ارجو مساعدتي ولكم جزيل الشكر.

#2

السلام عليكم

شرح مبسط:

struct تقوم بتحديد النوع الذى تريد إستخدامه, عندما تختار الحقول التى يتكون منها ال struct كل ما قمت به هو فقط تحديد نوع جديد من المتغيرات, فى هذه الحاله struct.

بعد ذالك تقوم بتعين متغير إسمه start والذى هو مؤشر لل struct الذى حددته.

واخيراً لا بد ان تحجز له مكان فى الذاكره بواصطه malloc, وكما هو مذكور فى المثال:

struct list
 {
  int data;
  struct list *ptr;
 };

كل ما يقوم به هذا الجز من الشفره هو تحديد الشكل, وهذا الجزء لا يحتاج إلى ذاكره وإنما هو جزء من البرنامج.

struct list *star;
start = (*struct list) malloc(sizeof(list))

وهذا الجزء يقوم اولاً بإنشاء متغير من نوع list وفى السطر الثانى يقوم بحجز مكان يكفى لإحتواء المتغير وهذا المكان سيكون مطابق للحجم الذى يحتاجه المتغير لذالك إستخدم التعريف sizeof .

والسلام

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#3

جميل ولكن الإشكال في ما بعد ذلك:

The next step is to create a second example of the struct:
start = (*struct list) malloc(sizeof(list));

This does indeed give us a new struct but we have now lost the original because the pointer to it has been overwritten by the pointer to the new struct. To avoid losing the original the simplest solution is to use:........

تم تعديل هذه المشاركة بواسطة Teao في 18 ديسمبر 2004 في 02:28

#4

طيب خلينا نوضح اكثر :

start هو مؤشر ل struct وحجزنا مكان فى الذاكره, والطريقه الوحيده للوصول إلى هذه الذاكره هو start صح.؟

عندما تقوم بنفس العمليه مره اخرى, اي

start = (*struct list) malloc(sizeof(list));

الذى يحدث هو انك حجزت مكان اخر فى الذاكره وطلبت من المؤشر start ان تغير قيمته حيث اصبح الان يؤشر إلى الذاكره الجديده.

وبذالك تفقد الطريقه الوحيده التى كان بامكانك الوصول إلى الذاكره الاولى بها, الا وهى start لانها الان تؤشر إلى مكان اخر.

لذالك يقترح الموضوع باستخدام مؤشرين, المؤشر الاول يحتفظ بعنوان ال struct الاول والثانى يحتفظ بعنوان ال struct الثانى.

والسلام

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#5

شكرا جزيلاً لك ، لقد عرفت أن الطريقة السابقة تسمى التراكيب المترابطة linkedList

وفكرتها بإختصار إضافة مؤشر في التركيب struct يؤشر على نفس التركيب ، الهدف منه ربط التركيب بتركيب آخر والذي يحوي مؤشر يربط التركيب بتركيب ثالث ....الخ.

فينتج لنا تراكيب مترابطة.

اكرر شكري :) .

#6

السلام عليكم

بالنسبه للتراكيب المترابطه هناك موضوع مفيد فى هذا المجال :

/index.php?showtopic=49875

لم اكن اعلم ان المشكله فى التراكيب المترابطه ظننت المشكله فى malloc, على كل حال راجع الموضوع السابق ففيه شرح وافى لها.

والسلام

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#7

ألف شكر لقد استفدت من الرابط

هذا الموضوع مغلق.

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