سؤال

دول مجلس التعاون الخليجي 4.4.1، C99

انا استخدم size_t, ، و size_t هو unsigned int. وبعد ومع ذلك، هذا يعتمد إذا كنت تقوم بتشغيل 32 بت أو 64 بت.

سوف أستخدم size_t لتخزين حجم المخزن المؤقت.

لذلك لا أعتقد أن هذا سيكون محمولا للغاية إذا كنت تستخدم عبر الهندسة.

مجرد سؤال، مع استخدام size_t على أي 32 أو 64 بت. ما هي الحالات التي سيؤدي إليها مشكلة أخطر؟

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

المحلول

size_t مضمون لتكون قادرة على عقد عدد البايتات من أي كائن في تنفيذك. لهذا السبب نوع العودة من sizeof يكون size_t.

نعم، إنه محمول.

نصائح أخرى

كما قال آخرون، size_t هو الصحيح ومقبول تماما لتخزين نتيجة sizeof() أو حجم أي كائن تمثل في بايت. ما عليك ان تراقبه هو ما يلي:

  1. size_t هو نفس حجم نوع عدد صحيح غير موقعة. وبعد ليس بالضرورة نفس عدد البايتات باعتبارها أكبر نوع عدد صحيح غير موقعة، unsigned int, unsigned long, ، إلخ.
  2. sizeof(size_t) هو عدد محدد من التنفيذ من البايتات memcpy"جي أو تعيين في أي نوع عدد صحيح غير uintmax_t هي فكرة سيئة. أنا لست متأكدا من أنه من الآمن افتراض أن ذلك متساويا أو أصغر من uintmax_t.
  3. كتابة size_t قيمة إلى ملف ثنائي وقراءة ذلك مرة أخرى إلى size_t من خلال عملية أخرى، على آلة مختلفة، أو عن طريق شيء مترجم مع خيارات مترجم مختلفة يمكن أن تكون خطرة على صحتك.
  4. إرسال أ size_t القيمة عبر الشبكة ومحاولة استلامها باستخدام sizeof(size_t) المخزن المؤقت على الجانب الآخر غير آمن بالأحرى.

كل هذه المشكلات القياسية مع أي نوع عدد صحيح آخر باستثناء unsigned char. وبعد وبالتالي size_t هو فقط المحمولة مثل أي نوع عدد صحيح آخر.

يجعل من المنطقي استخدام Size_t أو ssize_t للحصول على مخزن مؤقت إذا كنت تستخدم Malloc () أو قراءة (). بالنسبة لإصلاح قابلية استخدام Size_Max، SSIZES_MAX، SIFEOF (نوع في المخزن المؤقت الخاص بك) و٪ ZD أو٪ ZU Printf ().

لقد حصلت أيضا على OFF_T و PTRDIFF_T / SSIZE_T، والتي تختلف بين الهندسة بنفس الطريقة.

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

يجب ألا تستخدم Ints، والرجاء، أو أي شيء آخر. بصرف النظر عن أي شيء آخر، فإن حجم الاختلاف الطويل اعتمادا على المنصة (32 بت في معظم أنظمة 32 بت، 64 بت من أنظمة يونيكس 64 بت، 32 بت على Windows 64 بت).

من الصعب معرفة ما تقصد به "المحمولة" في هذه الحالة. يسمح مصطلح "المحمولة" بتفسيرات متعددة مختلفة بسهولة.

اكتب size_t لديه غرض محدد جدا. يمكن أن يحمل حجم أي كائن في التنفيذ المحدد. أي أنه نوع يمكن أن يحصل دائما على نتيجة sizeof() المشغل أو العامل. اكتب size_t لا يوجد لديه غرض آخر، وداخل تطبيقه المقصود هو 100٪ المحمولة، كما هو محمول مثل أي شيء يمكن أن يكون.

أي نوع من "المحمولة" التي تسأل عنها هي، مرة أخرى، غير واضحة.

يجب أن لا تفترض أن Size_t هو int غير موقعة (انظر هذه الإجابة)، لكنني أعتقد أنه يحتوي على نفس النطاق في كلا البصريين.

يعتمد على ما تستخدمه Size_t ل.

إذا كنت تستخدمه لتحديد حجم المخزن المؤقت ذاكرة، فسيكون ذلك آمنا، نظرا لأن Size_T كبير بما يكفي لمعالجة الذاكرة بأكملها من أي جهاز كمبيوتر. لذلك إذا كان المخزن المؤقت الذاكرة أكبر من ذلك، فلديك مشكلة على أي حال.

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

المشكلة الخطيرة الحقيقية الوحيدة مع هذا تحاول الوصول إلى مجموعة كبيرة إلى حد ما أو عدد كبير من أجل Size_T.

تماما مثل مجرد "INT" العادية قد يكون كافيا على 64 بت، ولكن قد يتسبب في تعطل على 32 بت لأنها كبيرة جدا بالنسبة إلى INT على نظام 32 بت.

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