سؤال

أحاول القيام ببعض التطوير الكلاسيكي C في Visual C ++ 2008 الذي سيقوم بتعديل أحرف سلسلة مثل ذلك:

void ModifyString(char *input)
{
  // Change first character to 'a'
  *input = 'a';
}

أحصل على استثناء غير معالج عندما أحاول تغيير حرف. يبدو أنه يمكنني القيام بذلك في Visual Studio 6 أو باستخدام دول مجلس التعاون الخليجي، ولكن ربما أنا فقط أنسى شيئا. هل تمرير Visual Studio بطريقة أو بأخرى * حسب القيمة (إدارة الذاكرة). إذا كان الأمر كذلك، كيف يمكنني تشغيل هذا؟

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

المحلول

من المحتمل أنك تمر سلسلة حرفية في مكان ما:

ModifyString("oops");  // ERROR!

تتيح لك C و C ++ أن يلقي ضمنا من حرفي السلسلة (التي لها نوع const char[]) ل char*, ، ولكن هذا الاستخدام مهمل. يسمح بتخصيص ثوابت السلسلة في الذاكرة للقراءة فقط (وعادة ما تكون)، لذلك إذا حاولت تعديلها، فستحصل على انتهاك وصول (خطأ تجزئة AKA أو خطأ في الحافلات). إذا لم يضع برنامج التحويل البرمجي ثوابت السلسلة في الذاكرة للقراءة فقط، فسيظل البرنامج يعمل، لكنه سلوك غير محدد.

الطريقة الصحيحة للقيام بذلك هي نسخ السلسلة إلى مخزن مؤقت قابل للكتابة:

// one way:
char mystring[] = "test";
ModifyString(mystring);  // ok

// another way:
char mystring[64];  // make sure this is big enough!!
strcpy(mystring, "test");
ModifyString(mystring);  // ok

نصائح أخرى

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

من المستحيل الإجابة على هذا السؤال دون رؤية كيفية استدعاء ModifyString. الوظيفة نفسها صحيحة على افتراض أن عقده هو أن يتم تمرير قيمة غير فارغة.

ومع ذلك، فمن الممكن أن تفشل موقع الاتصال عن طريق القيام بأي عدد من الأشياء

  • تمر باغلا
  • تمرير شار const عن طريق شرطة الشر

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

إذا قمت بنشر بعض الكود (أين يتم استدعاء الوظيفة، وكيف يتم استدعاؤها؟)، قد نكون قادرين على الإشارة إلى المشكلة الدقيقة.

السبب في العمل في دول مجلس التعاون الخليجي أو VC6 هو ببساطة ببساطة أنه سلوك غير محدد. لا يقول معيار C ++ أن "هذا يجب أن يعمل"، أو "هذا يجب أن يسبب تحطم". يمكن أن يحدث أي شيء إذا كنت تكتب إلى الذاكرة، فلا تملك الوصول إليها. واعتمادا على برنامج التحويل البرمجي، وسيختلف النظام الذي تقوم بتشغيل التطبيق عليه، وسيتغير العنوان الذي ينتهي بك الأمر إلى الوصول إليه. من خلال الحظ الهائل، تضغط على عنوان تسبب في انتهاك وصول عند ترجمة VC2008. ضمن دول مجلس التعاون الخليجي و VC6، لم تكن محظوظا، وحصلت على رمز يبدو للعمل, ، كتب ببساطة إلى بعض عنوان القمامة.

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