PDA

View Full Version : تفاوت بین اشاره گر استاتیک و عادی در malloc()



Mr FTHEL
شنبه 02 خرداد 1394, 11:33 صبح
سلام
دوستان بین دو کد زیر چه تفاوتی هست ؟

int *mk(int n)
{
int *x;
x=(int *)malloc(n*sizeof(int));
return x;
}




int *mk(int n)
{
static int *x;
x=(int *)malloc(n*sizeof(int));
return x;
}

rahnema1
شنبه 02 خرداد 1394, 11:45 صبح
سلام
از لحاظ نتیجه که فرقی نمی کنند
اما متغیر x ( یک اشاره گر با اندازه 8 بایت در سیستم 64 بیتی) اگه استاتیک باشه طول عمرش از اول برنامه هست تا آخر برنامه ولی وقتی استاتیک نباشه هر بار که تابع صدا زده می شه یک متغیر محلی (مثل بالا 8 بایتی) ایجاد می شه و طول عمرش هم با پایان تابع تموم می شه

Mr FTHEL
دوشنبه 04 خرداد 1394, 17:13 عصر
دوست عزیز هردوش اگر آدرس نکاه کنید یکی بر میگردنون یعنی من هرچیزی امتحان کردم هردوش میزاشت توش اطلاعات بزارم یعنی گیج شدم هردوش کار میکرد حتی بعد از اینکه تابع تموم شد ادرسش میمونه کامل گیج شدم

rahnema1
دوشنبه 04 خرداد 1394, 17:15 عصر
بله همون طور که گفتم از لحاظ نتیجه هیچ فرقی نمی کنند الان کجاش مبهمه؟

ali chegini
سه شنبه 05 خرداد 1394, 10:06 صبح
دوست عزیز هردوش اگر آدرس نکاه کنید یکی بر میگردنون یعنی من هرچیزی امتحان کردم هردوش میزاشت توش اطلاعات بزارم یعنی گیج شدم هردوش کار میکرد حتی بعد از اینکه تابع تموم شد ادرسش میمونه کامل گیج شدم
سلام.تابع شما حافظه میگیره و آدرسش رو بر میگردونه و شما بعدا باید اون حافظه رو آزاد کنی . اگر این کار رو نکنی حتی زمانی که برنامه کامل بسته بشه شما نشتی حافظه پیدا میکنی.
حافظه استک و هیپ داریم. زمانی که از استک حافظه بگیری بعد از تمام شدن تابع پاک میشه.

Mr FTHEL
جمعه 08 خرداد 1394, 15:22 عصر
بله همون طور که گفتم از لحاظ نتیجه هیچ فرقی نمی کنند الان کجاش مبهمه؟

یعنی هردوش یکی هست ؟ آخه شم گفتید اونی که استاتیک هست بعد از صدا زدن تابع از بین میره.
فرقشو نمیفهمم شما میگید نتیجه یکیه یعنی اصلن هیچ فرقی باهم ندارن ؟

stackprogramer
جمعه 08 خرداد 1394, 15:59 عصر
سلام زبان سی پلاس پلاس با زبان های دیگه مثل جاوا یک تفاوت اساسی داره و اون اینه که مدیریت حافظه به خود کاربر می سپاره،ما وفتی متغیر،اشاره گر تعریف می کنیم می توانیم به شیوه های معمولی،استاتیک،دینامیک،....
وقتی استاتیک تعریف می کنی بعد از خاتمه برنامه،اجرا شدن،حافظه هنوز برای برنامه ای که نوشته ای رزرو است،اما حالت معمولی با خاتمه برنامه،دیگه اون قسمت از حافظه در درسترس برنامه نیست،یعنی فقط لحظه ای که کار داشت با حافظه سی پی یو اون را به اون تخصیص داده بود،بعد اجرا سی پی یو ان ان قسمت از حافظه را ازاد می کند،نتیجه فرق نمی کنه ولی از دید برنامه و کد اسمبلی ،اپتیمایز بودن برنامه و سرعت بله فرق خواهد کرد،

ali chegini
شنبه 09 خرداد 1394, 13:23 عصر
البته من فکر میکنم کد نویسی به روش زیر درست نیست .
دلیل : چون عمر متغیر x که از نوع استاتیک و اشاره گر هست محدود به تابع mk نیست و این متغبر به فضای حافظه ای اشاره میکنه اگر تابع بار دیگر صدا زده بشه متغبر x که از قبل وجود داشته و الان به یک فضای جدید از حافظه اشاره میکنه در حالی که قبلا به یک فضای دیگر اشاره میکرد و الان ما دسترسی به اولین فضا نداریم .

int *mk(int n)
{
static int *x;
x=(int *)malloc(n*sizeof(int));
return x;
}

rahnema1
شنبه 09 خرداد 1394, 14:09 عصر
یعنی هردوش یکی هست ؟ آخه شم گفتید اونی که استاتیک هست بعد از صدا زدن تابع از بین میره.
فرقشو نمیفهمم شما میگید نتیجه یکیه یعنی اصلن هیچ فرقی باهم ندارن ؟

کاری که انجام میدن یکسانه یعنی میزانی مشخص از حافظه پویا به اندازه n را اشغال می کنند و اشاره گری که به ابتدای اون حافظه اشاره می کنه را بر می گردونند
حالا شما این تاپیک زیر که در مورد heap و static و stack و .. توضیح داده مطالعه بفرمایید باز اگه ابهامی بود بفرمایید
http://barnamenevis.org/showthread.php?489627