[英]Why and how returning the address of a static variable is OK while doing the same with non-static variable gives wrong result?
char str[] = "hello";
這個定義不起作用,但是
static char str[] = "hello"
這行得通,為什么呢?
完整代碼:
char *retstr(void)
{
char str[] = "hello"; //This definition dosnt work
return str;
}
int main()
{
printf("\n%s\n",retstr());
return 0;
}
的情況下
char str[] = "hello"; //This definition dosnt work
您正在嘗試返回局部變量str
的地址。 這里使用返回值是未定義的行為 ,因為一旦retstr()
函數完成執行,就不會存在str
變量。
太太
static char str[] = "hello";
之所以有效,是因為static
變量作為static storage duration 。 它的生命周期是程序的整個執行過程。 因此,即使在retstr()
函數完成執行后, str
仍然有效,因此返回值有效。
相關: C11
,第§6.2.4章, 對象的存儲時間 ,第3段
......與存儲類說明
static
,具有靜態存儲時間 。 它的生命周期是程序的整個執行過程,並且在程序啟動之前,它的存儲值僅初始化一次。
char str[] = "hello"; //This definition dosnt work
return str;
在這里,您將返回本地地址。 這就是為什么它不起作用
static char str[] = "hello"
在此過程中,您正在將'str'變量的范圍更改為整個程序。 這就是為什么它起作用。
您不能從函數返回局部變量。 局部變量存在於堆棧中,一旦函數完成,該堆棧空間將被釋放,並可由下一個函數調用使用。
char str[] = "hello"; //this won't work as it is a local variable
一旦超出范圍,就不會再有其他函數調用名為str
變量。
但是static
變量的生存期遍及整個程序。
static char str[] = "hello"; //this will work
因此,在使用static
它不會給出任何錯誤。
靜態變量僅創建一次,並且在函數返回時不會被銷毀,而局部變量在函數結束時會被銷毀。
每次調用函數時都會創建局部變量,並在返回時銷毀該局部變量。
如果是局部變量:您將返回一個指針,該指針不再存在。
如果是全局變量:字符串仍然存在,因此它將始終有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.