سؤال

أواجه مشكلة صغيرة هنا، لذا أقوم بتخزين مؤشر char (بدلاً من مصفوفة)، في مؤشر فارغ على النحو التالي:

char result[255];
CEVariable result_var(CEType::string, result);

الآن يتم تمرير result_var إلى المحرك الخاص بي، ويتم تخزينه كمؤشر، ثم يتم الوصول إلى بنية المتغير لاحقًا:( m_pData عبارة عن فراغ*، يشير إلى مصفوفة char )

strcpy((char*)pVar->m_pData, "42");

ولكن لم تتم كتابة أي بيانات عليه، وأنا متأكد من أنه يشير إلى مجموعة النتائج، كما راجعت العناوين.ربما أخطأت في فهمي للمؤشرات الفارغة، ولكن يبدو أن ما يلي يعمل:( اختبار عادل )

    char dest[255];
    void*ptr = dest;
    strcpy((char*)ptr, "asdsa");
    std::cout << dest;

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

يحرر:CEمتغير::

class CEVariable
{
public:
    CEVariable() {}
    CEVariable(CEType t, void* mem)
    {
        m_Type = t;
        m_pData = mem;
    }

    // Variable Type
    CEType m_Type;

    // Variable Data Ptr
    void* m_pData;
};

لا تخرج النتيجة عن النطاق حيث يتم تنفيذ كل شيء في وظيفة واحدة.

شكرا لك على وقتك.

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

المحلول

لك CEVariable::m_pData هو فقط أ المؤشر.ليس لديها مساحة محجوزة للسلسلة.

يجب عليك أولاً تخصيص بعض الذاكرة للسلسلة (على سبيل المثال:استخدام new[])، وثم strcpy() السلسلة المصدر إلى تلك المساحة المحجوزة:

// Dynamically allocate some memory with new[].
// For the string "42", it's 3 chars: '4', '2' and terminating NUL '\0'.
// For a generic string, you may want to use strlen(s)+1.
pVar->m_pData = new char[3];

// Copy string
strcpy(static_cast<char*>(pVar->m_pData), "42");

// Don't forget to release the string memory with delete[]
// when it's no longer needed.
// (e.g. in CEVariable's destructor.)

لاحظ أنه في لغة C++، يجب عليك استخدام قوالب نمط C++ بدلاً من قوالب نمط C.

المشكلة مع الخاص بك المكدس المخصص متعادل char result[255] هو أنه سيتم تدميره عندما يخرج المتغير عن النطاق.بدلاً من ذلك، إذا قمت بتخصيص ذاكرة السلسلة باستخدام new[] (من كومة)، ستظل هذه الذاكرة متاحة بعد قوس نهاية النطاق }.سيتم تحرير الذاكرة عند الاتصال delete[] على المؤشر.

نصائح أخرى

إذا كان النطاق الذي كان char result[255] لم يعد "على قيد الحياة"، وهذا سلوك غير محدد.تحتاج إلى استخدام new لتخصيص ذاكرة الكومة، أو جعلها static.

في هذا الجزء من الكود:

char result[255];
CEVariable result_var(CEType::string, result);

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

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