أهلا ومرحبا بكم مرة أخرى. في هذه المحاضرة ، أرغب في تقديم
عرض توضيحي لتحدينا
السابق ، والذي كان يجعلك تفهم كيفية تخصيص الذاكرة
ديناميكيًا باستخدام malloc.
سنقوم فقط ببعض القراءة البسيطة من لوحة المفاتيح
ثم نعرض سلسلة ، لكننا سنستخدمها مع مؤشرات
مخصصة ديناميكيًا ، ومؤشرات
شخصية.
لذلك دعونا نطرح قوالب الكود لإنشاء مشروع جديد.
وسنقوم فقط بتسمية مثال تخصيص الذاكرة الديناميكي هذا.
وأول شيء عليك القيام به عندما تريد
استخدام تخصيص الذاكرة الديناميكي هو التأكد من تضمين lib القياسي.
لحسن الحظ ، عندما تقوم بإنشاء مشروع في كتل التعليمات البرمجية
، فإنه سيتم تضمينه لك تلقائيًا.
لكن السبب الذي يجعلنا نحتاج إلى تضمين lib القياسي هو أن malloc ،
وظيفة malloc موجودة هناك. وتذكر أن malloc هي الوظيفة الرئيسية
لتخصيص الذاكرة. لديك أيضا calloc.
يعد Calloc مهمًا حقًا لأن calloc ستقوم
ببعض الحسابات الجيدة لعدد البايتات التي تحتاجها
لأن هذه معلمتان.
لكن الشيء الجيد في calloc هو أنه يقوم بتهيئة جميع البيانات إلى
أصفار إذا كانت ints وما إلى ذلك ، إنها وظيفة رائعة حقًا.
لديك realloc. ستعمل إعادة التخصيص على توسيع الذاكرة التي
تم تخصيصها بالفعل. لذلك تقوم بتمريرها في مؤشر.
من هذا المؤشر ، يحدد مقدار الذاكرة المخصصة له ويقوم
بنسخ كل ما كان موجودًا هناك إلى موقع ذاكرة جديد ، ثم تحدد أيضًا
عدد البايتات الإضافية التي تريد تخصيصها فقط
لإضافتها إلى موقع الذاكرة الجديد ، حقًا ميزة جميلة.
لكن تذكر أنه عند تخصيص ذاكرة للأعداد الصحيحة باستخدام malloc ، يجب
عليك تحديد مقدار الذاكرة التي تريد تخصيصها للبايت ، لكنك تريد
عادةً استخدام حجم عامل التشغيل.
لذلك دعونا نصل إلى ذلك.
في طريقتي الرئيسية ، سأقوم بإنشاء عدد صحيح ، وسأقول
فقط أن هذا سيكون بالحجم. بإدخال حجم عدد البايتات التي يريدون
تخصيصها في وقت التشغيل ، لذلك سيؤدي ذلك إلى تخزين الحجم.
الشيء الآخر الذي أرغب في إنشائه هو أنني أريد إنشاء مؤشر char
، وسيكون هذا مجرد نص. وسأقوم بتهيئة هذا ليصبح
فارغًا لأنه لا يشير إلى أي شيء فورًا.
الآن أول شيء أريد القيام به هو أن أطلب من المستخدم إدخال الحجم.
لذلك سأقول printf
، سأقول أدخل حدود النص.
وسيقومون بإدخال رقم لعدد البايت الذي تريد تخصيصه
ليكون عدد الأحرف.
وبعد ذلك سأقرأ ذلك باستخدام scanf.
Scanf ، المعلمة الأولى هي نوع محدد التنسيق لنوع البيانات.
ستكون النسبة المئوية d لأنني أقرأ عددًا صحيحًا.
ثم تذكر أن scanf يأخذ مؤشرًا.
نحن نعلم الآن أن الوظائف التي تتطلب
مؤشرات ، فأنت بحاجة إلى عنوان لتمريرها.
لذلك إذا كنت سأقوم بتمرير الحجم ، فإن الحجم ليس عنوانًا ما لم أستخدم عنوان المشغل.
سأذهب إلى علامة العطف وسأقول الحجم
، وهذا سيقرأ بعدد البايتات.
بمجرد أن أحصل على عدد البايتات ، يمكنني الآن تخصيص ذاكرة لها باستخدام وظيفة malloc.
و malloc سيعيد مؤشر الفراغ.
وسيكون المؤشر هو العنوان الأول لتلك الذاكرة
المخصصة حديثًا. لذلك يمكنك تخصيصه بشكل صحيح إلى نص.
لأن تذكر ، النص هو مؤشر.
نريد أن نشير النص إلى هذا العنوان الجديد الذي يتم إرجاعه.
لأن malloc يعيد مؤشر الفراغ ، علينا أن نلقيه.
نوع البيانات التي نشير إليها هو حرف لذلك نريد أن نقول char star ، ومن
ثم يمكننا استدعاء وظيفة malloc.
تأخذ وظيفة malloc عدد البايتات.
وبالتالي فإن عدد البايتات ، إذا مررت للتو في عدد البايتات ، فسيخصص هذا العدد
الكبير من البايتات فقط. ولكن اعتمادًا على نوع البيانات
، قد يكون نوع البيانات اثنين أو أربعة بايت.
لذلك إذا أردت تخصيص 10 أحرف ،
فأنت تريد التأكد من أنك تضرب
10 أحرف في حجم الحرف.
والآن سنقول
إن حجم n ضرب. غالبًا ما يتم استخدام حجم عامل التشغيل في
وظيفة malloc لأنها مستقلة عن الماكينة
، وسوف تخبرك بالمقدار الذي تحتاجه بالفعل لتخصيصه.
الآن هذا أكثر أهمية عندما يكون لديك أعداد صحيحة. تذكر أن الأعداد الصحيحة ، اعتمادًا على
النظام الذي تستخدمه ، والبنية التي تقوم بتشغيلها ، يمكن
تمثيل الأعداد الصحيحة بأربعة بايت ، أو اثنين بايت ، وعادة ما
يكون اثنان أو أربعة بايت.
إذا كنت تريد أن أقول إنني أريد تخزين عدد صحيح واحد
، لذلك سأقوم فقط بإنشاء أربعة بايت من الذاكرة ، حسنًا ، قد لا يكون
هذا صحيحًا لأنه ماذا لو كان 2 بايت.
لذلك تريد دائمًا تحديد
عدد الأعداد الصحيحة أو عدد الأحرف التي تريد تكوينها ثم ضربها
في حجم الحرف على نظامك. سيزودك عامل التشغيل Sizeof بعدد البايتات
التي يشغلها char. لذلك إذا كنت تريد إنشاء 10 أحرف
، فأنت تقول حجم الحرف 10 أضعاف. إذا كنت تريد إنشاء 10 أعداد
صحيحة لتخزين 10 أعداد
صحيحة ، فإنك تقول 10 أضعاف حجم int ، فهذا مهم حقًا.
الآن مع وظيفة calloc ، ليس عليك القيام بذلك. يأخذ Calloc في
الواقع معلمتين. والمعلمة الأولى هي
المؤشر على ما أعتقد ، ثم المعلمة
الثانية هي حجم البايت.
لذلك إذا قلت 24 int ، فكل ما عليك فعله هو أن تمر
24 فقط وتخصص لك تلقائيًا.
لذا فإن calloc هو أداة رائعة حقًا للاستخدام لأنه ليس عليك القيام بهذا الضرب.
لذلك بالنسبة لـ calloc ، فإن المعلمة الأولى هي الحجم.
لذلك إذا كنت تريد إنشاء 10 int ، فستمر فقط في 10.
ثم المعلمة الثانية
هي حجم البايت. لذلك ليس عليك القيام بعملية الضرب. يوفر عليك القليل من الخطوة.
الآن بعد أن قمنا بتخصيص الذاكرة ،
فأنت تريد التأكد من أن النص ليس فارغًا قبل أن تحاول إزالة مرجع النص.
لذلك تريد دائمًا التفاف هذا حول ليس نصًا ، وهذا سيقول إنه ليس
فارغًا أو يمكنك فقط القيام بذلك صراحة والقول ما إذا
كان النص لا يساوي فارغًا.
أرغب دائمًا في القيام بذلك لأنه من الخطير جدًا
محاولة إزالة الإشارة إلى المؤشر.
أي شيء يمكن أن يحدث. قد تكون قادرًا على كتابة البيانات فيه.
بداخله. ستكتبه في مكان آخر في الذاكرة. لذلك قد يفسد
البرنامج الخاص بك أو قد يكون لديك خطأ في التجزئة وقد يتعطل البرنامج.
لكن طالما أنك تخصص تلك الذاكرة حقًا ، يمكنك
الآن قراءة بعض البيانات بالفعل.
يمكنك استخدام git أو يمكنك استخدام scanf هنا.
ولكن ما تريد القيام به هو أنك
تريد الطباعة وإدخال بعض النصوص
ونريد أيضًا إضافة موجزات الأسطر هنا حتى يسهل قراءتها.
وسنستخدم scanf لأن هذا ما نعرفه.
و Scanf سيقرأ فقط في المائة.
في الواقع ، سأريكم خدعة.
سأستخدم scanf للقراءة في الحرف التالي حتى
يتوقف مؤقتًا ثم سأستخدم get s للقراءة في النص.
و gets هي مجرد وظيفة أخرى يمكنك عادةً استخدام f يحصل عليها. عليك فقط ضبطه على ضبطه على
دفق الإدخال.
ولكن يحصل على القراءة من دفق الإدخال القياسي ، والذي يكون افتراضيًا هو لوحة المفاتيح.
و يحصل سيأخذ مؤشرا. لذلك كل ما يتعين علينا القيام به هو تمرير النص
لأنه بالفعل مؤشر ، ولا يتعين علينا إدخال عنوان المشغل.
والشيء الجميل في الحصول على يسأل هو أنه يمكنك القراءة في سلاسل متعددة مفصولة بمسافات.
بمجرد أن نقرأها بالفعل ، يمكننا
فقط طباعتها. لذلك يمكننا أن نقول أن النص المدخل
إذا تم إدخاله عبارة عن خط مائل عكسي للكلمة
n ثم نص فاصلة. النص هو مؤشر.
يأخذ Printf مؤشرًا. لا يتعين علينا حذف المرجع منه.
لأنه إذا عرضت نصًا فقط ، فسيعرض
النص قيمة المؤشر الذي سيكون عنوانًا.
نريد في الواقع عرض قيمة ما يشير النص إليه.
ثم انتهينا. أوه كلا ، نحن بالتأكيد لم ننتهي. نريد أن نتصل بالمجان.
نريد تحرير مؤشرنا.
على الرغم من أننا عندما نخرج ، فإن الذاكرة ستكون خالية. ما زلنا نرغب في التأكد من تحريره
، ومن ثم ربما نرغب أيضًا في حفظه فقط ، نريد تعيين نص يساوي فارغًا.
لذلك دعونا نمضي قدمًا ونبني هذا ونرى ما سيحدث.
ولدي مشكلة لأنني لا أقرأ في المتغير
الصحيح.
لذلك أنا هنا لا أستخدم المتغير الصحيح. أريد استخدام الحجم
، ويبدو أننا
جيدون.
وهنا نذهب إلى الاختلاف الوحيد هنا وهو أنك لست مضطرًا إلى
إزالة الإشارة إلى النص لأن النص هو مؤشر حرف.
ما عليك سوى إزالة المرجع إذا كان في المؤشر وما إلى ذلك. لذلك فقط عندما تستخدم
النسبة المئوية ، فإنها تعرف تلقائيًا إلغاء إشارة
مؤشر الحرف.
هذا اختلاف واحد عند استخدام مؤشرات الشخصية
مقابل المؤشرات الأخرى. المؤشرات الأخرى التي يجب عليك
إزالة المرجع منها للحصول على القيمة لأنه لا يمكنك فعليًا
نسخ سلاسل إلى مصفوفات سلسلة وما إلى ذلك.
لن تكون قادرًا أبدًا على إجراء مساواة بنجمة
، سيكون عليك دائمًا استخدام نسخة str إذا كنت تريد نسخ النص.
لأن تذكر من المحاضرات ، لا يمكنك في الواقع
تعيين البيانات إلى مصفوفة ، ومؤشر الحرف هو مصفوفة.
لذلك يبدو هذا صحيحًا هنا. لا يوجد سبب لشطب المرجع.
نريد بناء هذا ، ثم نريد تشغيله.
وستلاحظ أننا وضعنا نهاية النص.
لنفترض أننا وضعنا 5 ، 6 لـ jason وطبعنا
الإدخال هو jason.
ويمكنك اللعب مع هذا البرنامج. ولكن مرة أخرى ، تشمل الوجبات
السريعة من هذا lib القياسي عندما تقوم بعمل malloc.
قم بتهيئة مؤشرات الطابع الخاص بك إلى قيمة خالية. قم بإجراء مسح ضوئي ، واستخدم
علامة العطف لأن الحجم ليس مؤشرًا.
عندما تقوم بالتلوين ، يقوم malloc بإرجاع مؤشر الفراغ ، لذا يجب عليك الإدلاء به.
تريد دائمًا أن تدخل داخل malloc الخاص بك. افعل حجم المشغل
لما تريد تخصيصه. مرات ، كم عدد الأحرف الفعلية أو
الأعداد الصحيحة. هذا ينطبق أكثر على الأعداد الصحيحة وأنواع
البيانات البدائية تقنيًا للأحرف. يمكنك فقط عمل الحجم ، يجب أن يعمل بشكل جيد.
تريد دائمًا التحقق من وجود فارغ ، تأكد من أنه ليس فارغًا.
عندما تذهب لاستخدام سلسلة الأحرف.
وبعد ذلك نقوم فقط بإدخال بعض النصوص المخزنة في ملفات الحصول عليها وطباعتها.
ثم أخيرًا وليس آخرًا ، نريد دائمًا تحرير مؤشراتنا حتى نتمكن من إعادة
ذلك إلى الكومة. أتمنى أن يساعدك هذا. شكرًا لك.