"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا يؤدي تعديل ثابت من خلال مؤشر غير ثابت إلى إنتاج سلوك غير محدد؟

لماذا يؤدي تعديل ثابت من خلال مؤشر غير ثابت إلى إنتاج سلوك غير محدد؟

تم النشر بتاريخ 2024-11-07
تصفح:670

Why Does Modifying a Constant through a Non-const Pointer Produce Undefined Behavior?

تعديل ثابت من خلال مؤشر غير ثابت: الخوض في سلوك غير محدد

في مقتطف التعليمات البرمجية المقدم، فإنك تعبر عن الارتباك حول السلوك تعديل عدد صحيح ثابت (e) من خلال مؤشر غير ثابت (w):

const int e = 2;

int* w = (int*) &e;  // Casting to remove const-ness
*w = 5;            // Modifying the value pointed to by w

بعد إجراء هذا التعديل، لاحظت أن:

  • عرض القيمة المشار إليها بواسطة w ( cout w
  • ومع ذلك، فإن عرض قيمة e (*cout

لاحظت أيضًا أن العنوان المشار إليه بواسطة w هو نفس عنوان e (cout cout e دون تغيير على الرغم من التعديل الذي تم إجراؤه من خلال w.

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

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

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

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3