تعديل ثابت من خلال مؤشر غير ثابت
في لغة C، لا يمكن تعديل متغير const بمجرد تهيئته. ومع ذلك، في بعض السيناريوهات، قد يبدو أنه تم تغيير متغير const. خذ بعين الاعتبار الكود التالي:
const int e = 2;
int* w = (int*)&e; // (1)
*w = 5; // (2)
cout إذا قمت بتشغيل هذا الكود، ستلاحظ سلوكًا غير متوقع:
5
2
على الرغم من تغيير *w إلى 5 في (2)، إلا أن e لا يزال يحتفظ بقيمته الأصلية وهي 2. وينبع هذا السلوك المتناقض ظاهريًا من العوامل التالية:
- (1 ) إلغاء الإشارة إلى مؤشر const (w) يسمح بالتعديل.
- (2) يتم تخزين القيمة المعدلة في موقع الذاكرة المشار إليه بواسطة w، والذي في هذه الحالة هو موقع الذاكرة حيث يتم تخزين e.
- ومع ذلك، يقوم المترجم بتحسين الكود، والتعامل مع e كثابت في وقت الترجمة وعدم تقييمه في وقت التشغيل.
ونتيجة لذلك، عندما يتم تقييم *w في وقت التشغيل، فإنه يُرجع القيمة المعدلة (5). ومع ذلك، عندما يتم تقييم e في وقت الترجمة، يتم استخدام قيمته الأصلية (2).
يُعرف هذا السلوك بالسلوك غير المحدد في لغة C. تعديل متغير ثابت بشكل مباشر أو غير مباشر يؤدي إلى عواقب لا يمكن التنبؤ بها، ويجب توخي الحذر في مثل هذه المواقف.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3