سؤال

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

Error   1   error C2440: 'return' : cannot convert from 'void *' to 'UInt32'

شكرًا!

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

المحلول

std::size_t address = reinterpret_cast<std::size_t>(voidptr);
// sizeof(size_t) must be greater or equal to sizeof(void*)
// for the above line to work correctly.

paul hsieh
أعتقد أنه يكفي التحويل void* ل size_t في هذا السؤال المحدد لثلاثة أسباب:

  • لم يحدد السائل ما إذا كان يريد حلًا محمولًا أم لا. قال ، أنه عمل معه. لا أعرف بالضبط ما يعنيه ذلك ولكن من الواضح بالنسبة لي أنه يعمل على IA-32 على Windows أو نظام آخر ضمن الوضع المحمي. هذا يعني أن تحويل مؤشر إلى عدد صحيح هو عملية محددة على هذا النظام حتى لو لم يتم تعريفه بواسطة C ++ القياسي.

  • ثانياً ، اقترحت أولاً تحويل المؤشر إلى int وهو أمر لا معنى له بوضوح litb و جالف أظهر لي. لقد قمت بتصحيح الخطأ الذي قمت به ، واستبدلت int مع size_t.

  • أخيرًا ، حاولت بجد أن أجد شيئًا ذا صلة بما اقترحته كحل في المعايير. لسوء الحظ ، لم أتمكن من العثور على أي شيء ذي صلة. لدي هذه الإشارة: Ansi ISO IEC 14882 2003. أعتقد أن Sellibitze أشار إلى ذلك إرادة كن جزءًا من المعايير القادمة. أنا حقًا لا أعرف عن C ، ومن الواضح أن C99 قدم هذا الحل الأمثل. أود أن يريني شخص ما حلًا محمولًا في C ++.

من فضلك ، لا تتردد في تصحيح أخطائي ، ما زلت طالبًا في يوني :)

شكرًا،

نصائح أخرى

مؤشر ، في C و C ++ هو تجسيد عنوان الذاكرة في شكل مجردة. يمكنك الحصول على تفسير سلسلة محدد للمؤشر على النحو التالي:

printf ("%p", voidPointer);

هناك طريقة أخرى هي إلقاءها على intptr_t:

(intptr_t) voidPointer;

يتم تعريف المؤشر الفارغ في C ++ على أنه يساوي "0" ، لذلك من المفترض أنك ستحصل على equiavlent من (intptr_t) 0 في العملية أعلاه. ومع ذلك ، لا يزال الأمر متروكًا لك وأيًا لم يكن لديك معرفة محددة في تطبيقها لتفسير ذلك كعنوان ذاكرة.

النقطة المهمة هي أنه في المنصات التي تستخدم نماذج ذاكرة غريبة مثل مجمعات DOS 16 بت X86 ، والتي لها شرائح مع إزاحة كنموذج ذاكرة ، يمكن تفسير المؤشرات بعدة طرق. في تمثيل العنوان الخام ، يمكن أن يكون DS: 0 أو SS: 0 بدلاً من مجرد 0.

أنت بحاجة إلى طاقم - إما أ reinterpret_cast (من الأفضل):

UInt32 address = reinterpret_cast<UInt32>( voidPointer );

أو فريق C على غرار C (لا ينصح به حقًا):

UInt32 address = (UInt32)voidPointer;

يمكنك الحصول على تمثيل سلسلة للعنوان مع Sprintf () أو عرضه باستخدام printf () باستخدام محدد تنسيق ٪ p ، على سبيل المثال:

printf( "%p", voidptr ) ;

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

في C ++ ، تمكنت من طباعة العنوان المدبب بـ:

cout << "Address: " << ((unsigned)my_ptr);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top