سؤال

ما هو الغرض من استخدام sizeof باستخدام malloc في C?لماذا من الضروري?

أعني يمكننا استخدام sizeof لكننا نعرف بالفعل حجم (=1000 بايت) ما نحن تخصيص في الذاكرة?

أنا مبتدئ في ج لذلك.قد يكون هذا سؤالا واضحا جدا.

هل كانت مفيدة؟

المحلول

أنواع البيانات والذاكرة مهمة

الجواب في أنواع البيانات.بينما تعرف كم عدد الكائنات كنت ترغب في تخصيص الذاكرة ل ، قد لا تريد أن تذهب من خلال عناء الحوسبة عقليا حجمها.

فهل الصيانة

أيضا, ماذا لو كان تكوين هذه التغييرات في وقت لاحق?ثم كنت ثمل ويجب أن تحرير كل شيء.

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

مثال 1 (ليس مهما جدا هنا):

char *s = malloc(100 * sizeof(char));

ولكن مهلا ، انها مجرد charس, لا بأس, كان بإمكانك فعل ذلك:

char *s = malloc(100);

يعمل بشكل عام.ولكن اطلاق النار على نفسك في القدم ، كما سترى أدناه.

مثال 2 (يهم قليلا بالفعل):

int *i = malloc(100 * sizeof(int));

بالتأكيد ، كان بإمكانك كتابة ذلك:

int *i = malloc(100 * 4);

وهذا يعني ، على افتراض أنك تطور بنية واحدة فقط تعرفها جيدا.

مثال 3 (بدءا يهم قليلا جدا!):

typedef struct s_listelement{
    int                  dataitem;
    struct s_listelement *link;
}              t_listelement;

t_listement *le = malloc(sizeof(t_listelement));

تخيل الآن أن بنية عنصر القائمة المرتبطة تحتوي على مجموعة من الحقول الأخرى...

هل تريد أن تثق sizeof(), أو اذهب واستمتع وقم بالرياضيات بنفسك?

نصائح أخرى

لنفترض أنك تريد تخصيص ذاكرة للتخزين ints.سوف تخمين الأولي الخاص بك أن يكون ، حسنا أنا بحاجة إلى أن يكون n الأعداد الصحيحة وكل عدد صحيح يتطلب x بايت.لذلك سيكون الفضاء n*x بايت.

ولكن في الواقع هذا x يعتمد على الهندسة المعمارية.ربما 16 بت ، 32 بت ، إلخ.لذلك لجعل التعليمات البرمجية الخاصة بك قادرة على العمل في بيئات مختلفة ، فمن المستحسن استخدام n*sizeof(int) بدلا من n*x.

على سبيل المثال ، إذا كنت بحاجة إلى تخصيص مساحة لـ 10 أعداد صحيحة:

int *p=malloc(sizeof(int)*10);

ماذا يحدث إذا قمت بتغيير حجم mallocated?

سيكون عليك 1) حساب الحجم الجديد مرة أخرى (ترك العديد من مشاكل البنى المستهدفة جانبا ، حيث سيتعين عليك حساب الحجم الجديد في كل هدف) ، 2) البحث عن الكل malloc(1000), ، تأكد من أنه يشير إلى mallocated (والتي قد تكون غير واضحة) واستبدالها بحجم جديد.

لم يكن لديك أي من هذه المشاكل 2 باستخدام sizeof.وبالتالي باستخدام sizeof يؤدي إلى رمز أكثر قابلية للصيانة وقراءة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top