簡體   English   中英

為什么和如何返回靜態變量的地址可以,而對非靜態變量執行相同的操作卻得到錯誤的結果?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM