請參閱下面的代碼示例。 函數中的函數fun_ret_loc_ptr()
返回一個警告:「函數返回局部變量的地址」。另一方面,函數fun_ret_loc_var()
中的語句return a
不這樣做。爲什麼gcc在返回指向局部變量的指針時拋出警告,而不是在返回局部變量時拋出警告?
#include <stdio.h>
int* fun_ret_loc_ptr()
{
int i = 10;
return (&i);
}
int fun_ret_loc_var()
{
int a = 20;
return a;
}
int main()
{
printf("val frm local ptr = %d\n", *fun_ret_loc_ptr());
printf("val frm local var = %d\n", fun_ret_loc_var());
}
我明白的是,在第一功能返回的地址(return (&i);
)審閱到,這是對應於起作用fun_ret_loc_ptr()
堆棧幀的一部分的存儲器位置。一旦這個函數返回,棧幀(激活記錄)就會被銷燬。同樣的東西應該適用於函數fun_ret_loc_var()
中的變量'a'(return a;
)。即使它被返回,當它在main中被使用時,對應於'a'的內存也會死掉。
從「return
」語句的功能角度來看,爲什麼會出現這種差異?
如果函數返回值,主函數如何知道返回值返回哪個位置? – Abhijeet
@Abhijeet:在返回期間,函數將其返回值推送到堆棧。然後調用者函數從堆棧中檢索(例如:彈出)它。 – jweyrich
@jweyrich複製返回值的位置取決於正在使用的調用約定。它可能會被傳回寄存器或跨越多個寄存器。 – James