PDA

View Full Version : سوال: چگونه میتوان فهمید که مقصد یک پوینتر در آن داده وجود دارد یا از بین رفته است؟



soroush_vs
یک شنبه 08 آذر 1388, 15:55 عصر
با سلام
فرض کنید که ما لیستی از پوینترها داریم از نوع داده ای خاص مانند یک ساختار .
برای ایجاد این لیست باید به تعداد عناصر لیست ساختار را ایجاد کرده و در حافظه قرار دهیم( مثلا با استفاده از عملگر new )
سوال اینجاست که از کجا میتوان فهمید که مکانی که مثلا پوینتر زیر به آن اشاره میکند حاوی داده است (حافظه تخصیص داده شده ) ؟


ptr->Struct.name;

اگر برای این پوینتر ساختار مورد نظر new نشده باشد ارور زمان اجرا خواهیم داشت.و من میخواهم بدانم چگونه میتوان فهمید که این کار انجام شده است و این حافظه وجود دارد.
این مورد را برای جلوگیری از خطای Access Violation که اغلب برای دسترسی به چیزی در حافظه که هم اکنون وجود ندارد روی میدهد استفاده کنم.
ممنون میشم پاسخ بدید.

tdkhakpur
یک شنبه 08 آذر 1388, 16:08 عصر
خوب شما برای مقدار دهی به اشاره گر فقط برای دادن آدرس مجاز هستید ولی تغییر در داخل عدد موجود در اشاره گر(محتوای آدرس) مجاز نیستید مگر اینکه سیستم این عدد موجود در اشاره گر را که همان آدرس هست را به شما داده باشد.


char *ptr;
ptr = NULL ; // مجاز
ptr = 544365; // مجاز
*ptr = 'a'; //غیر مجاز

soroush_vs
یک شنبه 08 آذر 1388, 16:24 عصر
ممنون اما این جواب سوال من نبود.ظاهرا بد توضیح دادم.
منظور من آدرس متغیر اشاره گر در حافظه نبود.
منظورم وجود یا عدم وجود متغیر از نوع ساختار (struct ) که اشاره گر به آن اشاره میکند بود.
چون اگر اشاره گر در برنامه به آن اشاره کند و در حافظه موجود نباشد(new نشده باشد) خطای زمان اجرا خواهیم داشت.
سوال من این است که چگونه میتوان فهمید که آیا در آن محل داده ای وجود دارد ؟ و در صورت وجود از آن استفاده کنیم :


if (Data is in There )
ptr->Struct.name;

mehdi.mousavi
یک شنبه 08 آذر 1388, 16:53 عصر
ممنون اما این جواب سوال من نبود.ظاهرا بد توضیح دادم.
منظور من آدرس متغیر اشاره گر در حافظه نبود.
منظورم وجود یا عدم وجود متغیر از نوع ساختار (struct ) که اشاره گر به آن اشاره میکند بود.
چون اگر اشاره گر در برنامه به آن اشاره کند و در حافظه موجود نباشد(new نشده باشد) خطای زمان اجرا خواهیم داشت.
سوال من این است که چگونه میتوان فهمید که آیا در آن محل داده ای وجود دارد ؟ و در صورت وجود از آن استفاده کنیم :


if (Data is in There )
ptr->Struct.name;


Pointer شما یا به حافظه ای اشاره می کنه (و در نتیجه NULL نیست)، یا به جایی اشاره نمیکنه (NULL هستش). در واقع اگر ptr->mystruct من NULL نبود، اونوقت میتونم به Struct اش دسترسی پیدا کنم. در واقع شما نگران شرایطی هستید که pointer شما NULL نیست، اما حافظه اختصاص داده شده به اون به سیستم برگردونده شده (بعنوان نمونه free شده).

در جنین شرایطی، شما میتونید بعد از free کردن ptr، اشاره گرتون رو دستی NULL کنید تا دفعه بعد، با توجه به NULL بودن یا نبودن اون تصمیم به دسترسی/عدم دسترسی به حافظه بگیرید.

موفق باشید.

tdkhakpur
یک شنبه 08 آذر 1388, 17:20 عصر
سوال من این است که چگونه میتوان فهمید که آیا در آن محل داده ای وجود دارد ؟ و در صورت وجود از آن استفاده کنیم :

شما میتوانید در ابتدای کار و جایی که متغییر شما از نوع ساختار تعریف میشود و یا زمانی که بخواهید حافظه گرفته شده را تحویل بدید مقدار را NULL در نظر بگیرید.


YourStruct *ptr=NULL;
// وشما اگر در این فاصله حافظه ای برای ساختار فوق از سیستم نگرفته باشدی مفدار اشاره تهی خواهد بود
if (ptr!=NULL)
ptr->Struct.name;

soroush_vs
دوشنبه 09 آذر 1388, 07:49 صبح
ممنونم از جواب دوستان
راه حل خوبی است و فکر میکنم تنها راه حل باشد.
دوستان دیگر اگر راه حل دیگری میدانند لطفا در اختیارمان قرار دهید.ممنونم