ما هي بعض التقنيات للتعامل بأمان كلا 32bit و 64bit المؤشرات دون ماكرو الشرطية؟

StackOverflow https://stackoverflow.com/questions/1533986

سؤال

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

char *argList = (char *)malloc(sizeof(id *) * argumentsCount);

وsizeof (معرف *) هو 4 على 32BIT و، 8 على 64BIT. أنا باستخدام شار * argList لبناء مجموعة من المؤشرات إلى الأشياء، ثم باستخدام طريقة getObjects NSArray ل:

[myNSArray getObjects:(id *)argList];

ويعمل في 32BIT و، تعطل في 64BIT (لأسباب واضحة)

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

المحلول

وعلى الرغم من أنني لم يكن لديك كل من السياق، وأظن أن هذا ليس حقا مشكلة 32/64 بت. ما ربما كنت أريده هو شيء على غرار:

id *argList = malloc(sizeof(id) * argumentsCount);

وتبعا للحالة، وأنا في بعض الأحيان مثل تخصيص كتل الذاكرة مثل هذا مع تخصيص zero'd بالفعل:

id *argList = calloc(1UL, sizeof(id) * argumentsCount);

وكلا هذين تخصيص جزء من الذاكرة قادرة على اجراء عدد argumentsCount من المؤشرات إلى الكائنات. يمكنك الوصول إلى مؤشرات الفردية مثل ذلك:

argList[0] = [[NSString alloc] initWithUTF8String:argv[0]];
argList[1] = [[NSString alloc] initWithUTF8String:argv[1]];
NSLog(@"Argument 0 is: %@", argList[0]);

وعندما تقوم بتعريف argList كمؤشر إلى نوع char، كما فعلت في المثال الخاص بك، فهرسة العناصر الفردية (أي argList[0]، argList[1])، سيتم الوصول إلى البايتات الفردية من الذاكرة المخصصة argList، لا مؤشرات الفردية كما كنت 'إعادة ربما تتوقع. عندما تقوم بتعريف argList كما id، كما فعلت في ما سبق، فهرسة عناصر الخطوات الفردية من خلال الذاكرة المخصصة argList التي كتبها بايت sizeof(id). فإن المترجم تعويض تلقائيا لحجم المؤشر الصحيح لبنية الهدف.

وعلى افتراض أن المؤشر عاد من malloc() هو 0x1000، وهنا جدول العناوين التي ستحسب لوضع 32 و 64bit للإعلانات char * وid *:

    32-bit: char *  id *     64-bit: char *  id *
argList[0]: 0x1000  0x1000           0x1000  0x1000
argList[1]: 0x1001  0x1004           0x1001  0x1008

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

نصائح أخرى

لماذا حفظ هويات في مجموعة C بدلا من واحدة من الطبقات جمع المتاحة في المؤسسة؟

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