PDA

View Full Version : مبتدی: بازگشت مقدار یک متغییر با آدرس



smemamian
چهارشنبه 30 اسفند 1391, 00:09 صبح
سلام دوستان

کد زیر باعث تولید خطا می کنه ؟ چرا ؟ عملا در خروجی جواب صحیح بازگشت داده میشه !

#include <iostream>
using namespace std;

int *func()
{
int temp = 123 ;
return &temp ;
}

int *fun2()
{
int temp = 1234 ;
return &temp ;
}

int main()
{
cout << *func() << endl ;
cout << *fun2() << endl ;
return 0;
}

میدونم متغییر محلی در تابع نباید بازگشت داده بشه ولی چرا ؟! در ادامه نوشتن کد امکان دارد چه خطاهایی رخ بده ؟

hadi0x7c7
چهارشنبه 30 اسفند 1391, 02:13 صبح
چون که هر موقع یه تابع صدا زده میشه توی stack تمام متغیر های محلی اون(و یه سری چیزای دیگه) allocate میشن و وقتی return میکنیم(از تابع بیرون مییاییم) اون فضا نابود میشه ! حالا شما ادرس کجا رو داری به ما میدی ؟ ناکجا !

smemamian
چهارشنبه 30 اسفند 1391, 02:17 صبح
ولی این گفته زمانی درسته که دیگه مقداری بازگشت داده نشه !

hadi0x7c7
چهارشنبه 30 اسفند 1391, 02:37 صبح
ربطی به این که مقدار بازگشت داده بشه یا نشه نداره ! یه سرچ درباره stack frame بزنید متوجه میشید. شاید اینم بدرد بخوره http://c.learncodethehardway.org/book/ex17.html
(قسمت
Heap vs. Stack Allocation)

rezaricky
چهارشنبه 30 اسفند 1391, 09:51 صبح
اره درسته خروجی رو درست نشون میده ، ولی اگه یک تابع دیگه فراخوانی کنی دیگه خروجی رو درست نشون نمیده،
بعیارت دیگه کد شما رفتار تعریف نشده داره
مثلا این کد رو اجرا کن و خروجی رو ببین
#include <iostream>
using namespace std;

int *func()
{
int temp = 123 ;
return &temp ;
}

void AnotherFunc()
{
int a =100;
}

int main()
{
int * p = func();
cout << *p << endl ;
AnotherFunc();
cout << *p << endl ;

cin.get();
return 0;
}

یک نکته دیگه این که اگه متغیر محلی temp رو static تعریف کنی خروجی تغییر نمیکنه ولی توصیه نمیشه
#include <iostream>
using namespace std;

int *func()
{
static int temp = 123 ;
return &temp ;
}

void AnotherFunc()
{
int a =100;
}

int main()
{
int * p = func();
cout << *p << endl ;
AnotherFunc();
cout << *p << endl ;

cin.get();

smemamian
چهارشنبه 30 اسفند 1391, 11:58 صبح
ولی اگه از اسم خوده تابع استفاده کنی نتیجه‌ی مورد قبولی برمی گردونه !

#include <iostream>
using namespace std;

int *func()
{
int temp = 123 ;
return &temp ;
}

void AnotherFunc()
{
int a =100;
}

int main()
{
int * p = func();
cout << *p << endl ;
AnotherFunc();
cout << *p << endl ;
cout << *func() << endl ;
return 0;
}

rezaricky
چهارشنبه 30 اسفند 1391, 18:54 عصر
اره درسته
ولی اگه قراره هر بار تابع رو فراخوانی کنیم، دیگه چرا باید اشاره گر برگدونیم ؟ همون int رو برمیگردنیم

smemamian
چهارشنبه 30 اسفند 1391, 19:22 عصر
بله. ولی قصدم استفاده از مقدار برگشتی نیست.. بیشتر کتاب ها و.. گفته شده که مقدار برگشتی نتیجه‌ی دلخواه پس از استفاده‌ی مجدد از استک نخواهد بود !
فکر کنم منظورشون همانی است که شما در پست قبلی به اون اشاره کردید .
تشکر