خراب شدن مقدار متغییر LPCTSTR - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

وبـــلاگ هــفت خــط کــد


آموزش های برنامه نویسی
۱۴۴ نفر آنلاین
۱ عضو و ۱۴۳ مهمان در سایت حاضرند

خراب شدن مقدار متغییر LPCTSTR

0 امتیاز
43 بازدید

سلام
تیکه کد زیرو در نظر بگیرین و بگین علت این که محتوی متغییر testA چه چیزی میتونه باشه (شبیه سوال امتحان شد ببخشید)

* اینکه LPCTSTR چیه و آرایه ای از TCHAR رو میدونم :) مشکلم اینه که چرا دیتا یهو خراب میشه در صورتی که اصلا کاری با اون متغغیر ندارم دیگه.

 

LPCTSTR  ReturnValue()
{
	TCHAR tmp[6] = TEXT("Hello");

	return tmp;
}
void	  test()
{
	LPCTSTR testA;
	testA = ReturnValue();

	LPCTSTR testB = testA;

	/* Corrupt */
	wcout << testB;
}

 

 

کدبالا مشکل داره ولی این درسته، 

LPCTSTR  ReturnValue()
{
	TCHAR tmp[6] = TEXT("Hello");

	LPCTSTR lpRet = static_cast<LPCTSTR>(malloc(sizeof(tmp)));
	_tcscpy_s(LPTSTR(lpRet),sizeof(tmp),  tmp);

	return lpRet;
}

void	 test()
{
	LPCTSTR testA;
	testA = ReturnValue();

	LPCTSTR testB = testA;

	wcout << testB;
}

فقط چرا تو کد اولی با این با کست هم مشکلی نداره تابع مقدار درست رو برمیگردونه حتی میشه کپیشم کرد ولی به محظ دسترسی تمام رفرنساش خراب میشه !!

سوال شده شهریور 15, 1394  بوسیله ی R0b3rtX99 (امتیاز 54)   3

1 پاسخ

+2 امتیاز

 در همان مثال اول چون متغیر tmp از stack استفاده می کنه به این ترتیب آدرسش بیرون از تابع نامعتبره کد را به صورت زیر تبدیل کنید.

TCHAR *tmp = TEXT("Hello");

 

پاسخ داده شده شهریور 15, 1394 بوسیله ی مصطفی ساتکی (امتیاز 17,035)   17 26 66
ممنون
سوال منم همینه چرا  LPCTSTR testB = testA; درست کار میکنه و آدرس هنوز ولیده !
این به خاطر VC اه یا دلیل دیگه ای داره ؟
خوب بخاطر اینکه فضای آن از heap گرفته شده توسط دستور malloc و شما آدرس حافظه را به بیرون تابع انتقال میدید ولی آدرس های مربوط به stack فقط در تابع جاری معتبر هستند.
نه من نمونه اولی رو میگم که از malloc هم استفاده نشده، کدو تست کنید LPCTSTR testB = testA; در کد اولی به درستی کار میکنه!

یه سوال دیگه در مورد کد دوم حالا که از malloc درون تابع استفاده کردم چطوری باید حافظه رو آزاد کنم ؟؟
منظورم دقیقا همین کدی که گذاشتم.
...