تخزين مؤشرات char ثم تعبئتها لاحقًا
سؤال
أواجه مشكلة صغيرة هنا، لذا أقوم بتخزين مؤشر 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
بمجرد أن تكون بالخارج نطاق من هذه الوظيفة.