يمكن realloc صفيف ، ثم لماذا استخدام المؤشرات؟

كان هذا مقابلة توظيف الوظيفي واجهت. سألت ما إذا كنا نستطيع إعادة تخصيص Array ، قلت نعم. ثم سألوا - فلماذا نحتاج إلى مؤشرات لأن معظم الناس يعطون مبررًا لفقد مساحة الذاكرة. لم أتمكن من إعطاء إجابة مرضية. إذا كان أي شخص يمكن أن يعطي أي إجابة مرضية ، سأكون ملزما. يرجى ذكر أي موقف يمكن أن يتعارض فيه البيان أعلاه.

شكرا لكم.

2

4 إجابة

يمكنك فقط إعادة تخصيص صفيف تم تخصيصه ديناميكيًا. إذا تم تخصيصها بشكل ثابت ، فلا يمكن إعادة تخصيصها [بأمان]. *

تحتفظ المؤشرات بعناوين البيانات في الذاكرة. يمكن تخصيصها ، إلغاء تخصيصها ، وإعادة تخصيصها ديناميكيًا باستخدام مشغلي الجديدة/الحذف في C ++ و malloc/free in C.

أود أن أقترح بشدة أن تقرأ <�م> وC لغة البرمجة </م> بواسطة كيرنيغان وريتشي والنص الصلبة C ++ مثل <�م> C ++ من الألف إلى الياء </م> </من هربرت شيلدت.

يعد استخدام الذاكرة الديناميكية والمؤشرات والإزاحات وغيرها أمرًا أساسيًا لاستخدام هاتين اللغتين. إن عدم معرفة كيفية عملها ، وسبب وجودها سيكون سبباً محتملاً لأصحاب العمل المحتملين لرفضك.

* المحول البرمجي لا يجب السماح لك بإعادة تخصيص أي شيء تم تخصيصه بشكل ثابت ، ولكن إذا حدث ذلك ، فإن السلوك غير محدد

8
وأضاف
لم أشاهد معياره المشروح C - لذا لا يمكنني التعليق مباشرة ، لكني استخدمت كتاب Ground Up في الفصول الدراسية ، ووجدت الطلاب بالفعل "احصل عليه" باستخدام هذا النص
وأضاف المؤلف warren, مصدر
هل C ++ من Schildt أفضل من "المعيار C الخاص به؟"
وأضاف المؤلف Jonathan Leffler, مصدر

إن الصياغة غريبة بعض الشيء ، لكن بالنسبة لي يبدو أن سؤال المقابلة كان سؤالًا مفتوحًا تم تصميمه ليسمح لك بشرح ما تعرفه عن المصفوفات ، والمؤشرات ، وتخصيص الذاكرة الديناميكية ، وما إلى ذلك. إذا كنت الشخص الذي أجرى المقابلة ، كنت أريد المرشح لتوضيح الاختلافات بين int * a = malloc (10 * sizeof (int)) ؛ و int a [10]؛ . لم يتم صياغة سؤال المتابعة بشكل جيد للغاية ، ولكن ربما كان محاولة لحث المرشح في اتجاه الاختلاف بين مؤشر وصفيحة وتعيين قطار الفكر.

5
وأضاف

حسنا. لا يمكنك إعادة تخصيص مصفوفة تم الإعلان عنها بشكل ثابت. سيكون الغرض من استخدام المؤشرات (بدلاً من مصفوفة المعلنة بشكل ثابت) ، بحيث يمكنك إعادة تخصيص المساحة. أعتقد ، أن يكون صحيحا من الناحية الفنية ، يمكنك إعادة تخصيص مجموعة محددة بشكل ثابت عن طريق تمرير مؤشر إليها ، لكنني لا أريد ذلك. السلوك غير معرف إذا كان المؤشر على الذاكرة التي لم يتم تخصيصها بواسطة malloc.

2
وأضاف
تتيح لنا وظيفة realloc زيادة أو تقليص حجم المساحة المخصصة سابقًا. (الاستخدام الأكثر شيوعًا هو زيادة مساحة.) للتقديم ، إذا خصصنا مساحة لـ 512 عنصرًا في صفيف نقوم بتعبئته في وقت التشغيل ولكننا نكتشف ذلك نحن بحاجة إلى غرفة لأكثر من 512 عنصرًا ، يمكننا الاتصال بـ realloc.
وأضاف المؤلف iankits, مصدر
linux.die.net/man/3/realloc - لن يساعدك في البنود المخصصة بشكل ثابت
وأضاف المؤلف warren, مصدر

أنا لا أفهم حقا كيف استخدام المؤشرات "النفايات الذاكرة". وظيفة realloc: -

void *realloc(void *ptr, size_t size);

يأخذ المؤشر إلى الذاكرة لتغيير حجم كمعلمة. أيضا ، هناك الكثير من الاستخدامات للمؤشرات أكثر من الذاكرة الديناميكية ، تمر بالإشارة على سبيل المثال.

1
وأضاف
قد يكون المقصود من "نفايات الذاكرة" أن يعني int * ra = malloc (10 * sizeof (int))؛ النتائج في استخدام المزيد من التخزين أكثر من ra [10] ؛ بسبب النفقات العامة لتنفيذ malloc الخاص بك. ولكن هناك أسباب أفضل لاستخدام صفائف في بنية تخزين العناصر عند الضرورة.
وأضاف المؤلف Steve Jessop, مصدر
أوه ، وعندما ينتمي المصفوفة إلى شيء يمثله هيكل ، هناك "الذاكرة" الواضحة للذاكرة التي تخزن مؤشرًا إلى المصفوفة ، بدلاً من تضمين المصفوفة في البنية والوصول إليها بواسطة اسم العضو ، تستخدم حجمًا إضافيًا (فراغًا) *) بايت.
وأضاف المؤلف Steve Jessop, مصدر