سؤال

أحاول دائمًا تجنب إرجاع سلسلة حرفية، لأنني أخشى ألا يتم تعريفها خارج الوظيفة.لكنني لست متأكدا إذا كان هذا هو الحال.لنأخذ على سبيل المثال هذه الوظيفة:


const char *
return_a_string(void)
{
    return "blah";
}

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

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

المحلول

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

نظرًا لأنه نطاق حرفي لسلسلة ثابتة لا يهم.

تجميع السلسلة:

شيء واحد يجب الانتباه إليه هو أنه في بعض الحالات، يمكن "تجميع" سلسلة حرفية متطابقة لتوفير مساحة في الملف القابل للتنفيذ.في هذه الحالة، يمكن أن يكون لكل سلسلة حرفية نفس عنوان الذاكرة.يجب ألا تفترض أبدًا أن الأمر سيكون كذلك أو لا يكون كذلك.

في معظم المترجمين، يمكنك تعيين ما إذا كنت تريد استخدام تجميع السلاسل الثابتة لتحريك القيم الحرفية أم لا.

الحد الأقصى لحجم السلسلة الحرفية:

العديد من المترجمين لديهم الحد الأقصى لحجم السلسلة الحرفية.على سبيل المثال، مع VC++، يكون هذا حوالي 2,048 بايت.

تعديل سلسلة حرفية يعطي سلوكًا غير محدد:

لا ينبغي أبدًا تعديل سلسلة حرفية.لديها سلوك غير محدد.

char * sz = "this is a test";
sz[0] = 'T'; //<--- undefined results

حرفية سلسلة واسعة:

كل ما سبق ينطبق بالتساوي على سلسلة واسعة من النصوص الحرفية.

مثال:L"هذه سلسلة حرفية واسعة";

ينص معيار C++ على ما يلي: (قسم lex.string)

1 سلسلة حرفية هي سلسلة من الأحرف (كما هو محدد في lex.ccon) محاطة باقتباسات مزدوجة ، ابتداء اختياريا بالحرف l ، كما في "..." أو l "...".السلسلة الحرفية التي لا تبدأ بـ L هي سلسلة عادية حرفية ، ويشار إليها أيضًا على أنها سلسلة ضيقة حرفية.تحتوي السلسلة الحرفية العادية على نوع "مجموعة من N const char" ومدة التخزين الثابتة (basic.stc) ، حيث N هو حجم السلسلة كما هو محدد أدناه ، ويتم تهيئته مع الأحرف المعطاة.سلسلة حرفية تبدأ بـ L ، مثل L "ASDF" ، هي سلسلة واسعة.تحتوي الخيط الواسع على نوع "مجموعة من n const wchar_t" ولديها مدة تخزين ثابتة ، حيث N هو حجم السلسلة على النحو المحدد أدناه ، ويتم تهيئته باستخدام المعالم المحددة.

2 ما إذا كانت جميع الحرفيات المتميزة متميزة (أي ، يتم تخزينها في الكائنات غير المتداخلة) محددة للتنفيذ.تأثير محاولة تعديل سلسلة حرفية غير محدد.

نصائح أخرى

وأنا أعطيك مثالا بحيث يصبح حيرتك واضحة إلى حد ما

char *f()
{
char a[]="SUMIT";
return a;
}

وهذا العمل متعود.

ولكن

char *f()
{
char *a="SUMIT";
return a;
}

وهذا يعمل.

والسبب: "SUMIT" هو الحرفي الذي يحتوي على النطاق العالمي. في حين أن مجموعة والذي هو مجرد سلسلة من الأحرف { 'S'، 'U'، 'M'، 'I'، "T '' \ 0 '} لديها نطاق محدود ويختفي حالما يتم إرجاع البرنامج.

ويساعد هذا الأمل

وهذا صحيح في C (أو C ++)، والبعض الآخر قد أوضح.

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

ووC (أو C ++) القياسية لا يفهم أو مراعاة التحميل ورمز التفريغ في وقت التشغيل، لذلك كل ما يفعل ذلك سيواجه عواقب والمعرفة من قبل التنفيذ: في هذه الحالة فإن النتيجة هي أن سلسلة حرفية، الذي هو من المفترض أن يكون مدة التخزين الثابتة، يبدو من POV من قانون داعيا إلى عدم تستمر لكامل مدة البرنامج.

نعم، هذا شيء طيب. وهم يعيشون في جدول سلسلة العالمي.

لا، سلسلة حرفية لا يكون نطاقها، بحيث يتم ضمان التعليمات البرمجية للعمل عبر كل المنابر والمجمعين. يتم تخزينها في صورة ثنائية البرنامج الخاص بك، حتى تتمكن من الوصول إليها دائما. ومع ذلك، في محاولة لإرسال لهم (من قبل الصب بعيدا const) سوف يؤدي إلى سلوك غير معرف.

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

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

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