ما حجم هذه البنية؟ و لماذا؟

البرنامج التالي يعطي الإخراج 4. اعتقدت أنه سيتم إخراج 8 sizeof (int) + sizeof (غير الموقعة int)

#include
#include
int main()
{
        struct node
        {
                int a;
                struct node * next;
        };
        struct node * p= (struct node *) malloc( sizeof( struct node));
        printf("%d", sizeof( p));
}
1
أنت تأخذ حجم المؤشر بدلاً من الكائن نفسه.
وأضاف المؤلف Mysticial, مصدر
من المهم أيضًا معرفة ما إذا كنت تقوم بتجميع هذا للـ 32 بت أو 64 بت ، لأن ذلك يُحدث اختلافًا حول حجم int والمؤشرات.
وأضاف المؤلف Raceimaztion, مصدر
من المهم أيضًا معرفة ما إذا كنت تقوم بتجميع هذا للـ 32 بت أو 64 بت ، لأن ذلك يُحدث اختلافًا حول حجم int والمؤشرات.
وأضاف المؤلف Raceimaztion, مصدر

6 إجابة

في هذا الرمز ، p هو مؤشر ، لذا فأنت تقوم فقط بطباعة حجم المؤشر (والذي هو على ما يبدو 4 بايت في تركيبة برنامج التحويل البرمجي/OS). إذا كنت تريد حجم البنية ، تحتاج إلى طباعة sizeof (* p) . أيضًا ، كما ذكر ، فإن استخدام "٪ d" لـ size_t لن يعمل بالضرورة ("٪ zu" صحيح ، على الرغم من أن٪ d سيعني معظم المترجمين/أنظمة التشغيل في العالم الحقيقي). أيضا ، لا ينبغي أن نفترض أن حجم "يجب" أن تكون بنية 8. يمكن أن تكون أكبر من المؤشرات ، أو قد ترغب المترجم في لوحة أو محاذاة هيكل بطريقة غريبة.

2
وأضاف

في هذا الرمز ، p هو مؤشر ، لذا فأنت تقوم فقط بطباعة حجم المؤشر (والذي هو على ما يبدو 4 بايت في تركيبة برنامج التحويل البرمجي/OS). إذا كنت تريد حجم البنية ، تحتاج إلى طباعة sizeof (* p) . أيضًا ، كما ذكر ، فإن استخدام "٪ d" لـ size_t لن يعمل بالضرورة ("٪ zu" صحيح ، على الرغم من أن٪ d سيعني معظم المترجمين/أنظمة التشغيل في العالم الحقيقي). أيضا ، لا ينبغي أن نفترض أن حجم "يجب" أن تكون بنية 8. يمكن أن تكون أكبر من المؤشرات ، أو قد ترغب المترجم في لوحة أو محاذاة هيكل بطريقة غريبة.

2
وأضاف

p is just a pointer. Its size depends on ABI, which is in your case 4.

1
وأضاف
أنت على حق أنه حجم المؤشر. أنت مخطئ لتفترض ما هو هذا الحجم.
وأضاف المؤلف Genia S., مصدر
لا ، سيكون حجم المؤشر ، والذي قد يكون أو لا يكون حجم int غير موقعة.
وأضاف المؤلف Lee Daniel Crocker, مصدر

p is just a pointer. Its size depends on ABI, which is in your case 4.

1
وأضاف
أنت على حق أنه حجم المؤشر. أنت مخطئ لتفترض ما هو هذا الحجم.
وأضاف المؤلف Genia S., مصدر
لا ، سيكون حجم المؤشر ، والذي قد يكون أو لا يكون حجم int غير موقعة.
وأضاف المؤلف Lee Daniel Crocker, مصدر

والإجابة الصحيحة : ناتجك ، إن وجد ، غير محدد ، لأنك تستخدم محدد تنسيق غير صحيح في استدعاء printf() . يجب أن تستخدم ٪ zu بدلاً من ذلك - sizeof() ينتج كائن من النوع size_t .

وبالتالي ، فإن برنامجك يستدعي سلوكًا غير معروف ، ويكون حرًا (وطباعة) أي شيء يريده.

1
وأضاف
النقطة هي أن sizeof (x) لا يعطي غير الموقّع int ، فإنه يعطي size_t . في معظم الأنظمة ، يكون هذا هو نفس غير الموقّع int ، لكن لا يُطلب منك ذلك. ٪ zu هو محدد التنسيق المناسب لـ size_t ، في حين أن ٪ d قد يسبب أشياء فظيعة.
وأضاف المؤلف amalloy, مصدر
أعتقد أن تحويل int غير مقيم إلى int لن ينتج عنه سلوك غير معروف. قد يحول بعض الشيء مثل 255 إلى شيء مثل -127 على أنظمة 8 بت. غير متأكد على الرغم من. سيكون مصدر للسلوك غير معرفة سيكون موضع تقدير كبير!
وأضاف المؤلف Atmaram Shetye, مصدر

والإجابة الصحيحة : ناتجك ، إن وجد ، غير محدد ، لأنك تستخدم محدد تنسيق غير صحيح في استدعاء printf() . يجب أن تستخدم ٪ zu بدلاً من ذلك - sizeof() ينتج كائن من النوع size_t .

وبالتالي ، فإن برنامجك يستدعي سلوكًا غير معروف ، ويكون حرًا (وطباعة) أي شيء يريده.

1
وأضاف
النقطة هي أن sizeof (x) لا يعطي غير الموقّع int ، فإنه يعطي size_t . في معظم الأنظمة ، يكون هذا هو نفس غير الموقّع int ، لكن لا يُطلب منك ذلك. ٪ zu هو محدد التنسيق المناسب لـ size_t ، في حين أن ٪ d قد يسبب أشياء فظيعة.
وأضاف المؤلف amalloy, مصدر
أعتقد أن تحويل int غير مقيم إلى int لن ينتج عنه سلوك غير معروف. قد يحول بعض الشيء مثل 255 إلى شيء مثل -127 على أنظمة 8 بت. غير متأكد على الرغم من. سيكون مصدر للسلوك غير معرفة سيكون موضع تقدير كبير!
وأضاف المؤلف Atmaram Shetye, مصدر