سؤال

أنا في حيرة من أمري مع مؤشرات const في C++ وكتبت تطبيقًا صغيرًا لمعرفة النتيجة.أحاول (على ما أعتقد) إضافة مؤشر إلى سلسلة، والتي لا ينبغي أن تعمل بشكل صحيح، ولكن عندما أقوم بتشغيل البرنامج أحصل على "hello World" بشكل صحيح.هل يمكن لأي شخص أن يساعدني في معرفة كيفية عمل هذا السطر (s += s2)؟

رمز بلدي:

#include <iostream>
#include <stdio.h>
#include <string>

using namespace std;

const char* append(const char* s1, const char* s2){
    std::string s(s1);     //this will copy the characters in s1
    s += s2;               //add s and s2, store the result in s (shouldn't work?)
    return s.c_str();      //return result to be printed
}

int main() {
    const char* total = append("hello", "world");
    printf("%s", total);
    return 0;
}
هل كانت مفيدة؟

المحلول

المتغير s محلي داخل append وظيفة.مرة واحدة في append ترجع الدالة أن المتغير قد تم إتلافه، مما يترك لك مؤشرًا إلى سلسلة لم تعد موجودة.يؤدي استخدام هذا المؤشر إلى سلوك غير محدد.

نصيحتي لك حول كيفية حل هذا:يستخدم std::string طوال الطريق!

نصائح أخرى

أنت تضيف const char* المؤشر إلى أ std::string وهذا ممكن (انظر هذا المرجع).لن يكون من الممكن إجراء تلك العملية char* اكتب (سلسلة نمط C).

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

تم تحميل الفئة std::string بشكل زائد operator += لمعامل من النوع const char *

basic_string& operator+=(const charT* s);

في الواقع، يقوم ببساطة بإلحاق السلسلة التي يشير إليها هذا المؤشر بمحتويات الكائن من النوع std::string وتخصيص الذاكرة الإضافية إذا لزم الأمر.على سبيل المثال، يمكن للمشغل المحمل بشكل زائد داخليًا استخدام وظيفة C القياسية strcatمن الناحية النظرية، فهو مشابه لمقتطف التعليمات البرمجية التالي.

char s[12] = "Hello ";
const char *s2 = "World";

std::strcat( s, s2 );

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

printf("%s", total);

يمكن أن يؤدي إلى سلوك غير محدد.

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