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 عصر
بله. ولی قصدم استفاده از مقدار برگشتی نیست.. بیشتر کتاب ها و.. گفته شده که مقدار برگشتی نتیجهی دلخواه پس از استفادهی مجدد از استک نخواهد بود !
فکر کنم منظورشون همانی است که شما در پست قبلی به اون اشاره کردید .
تشکر
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.