這個函式有什麼問題?請指出。[美國著名硬碟公司2023年4月面試題]
char *stra()
char str="hello,world!!";
return str;
一般的來說,函式是可以返回區域性變數的。 區域性變數的作用域只在函式內部,在函式返回後,區域性變數的記憶體已經釋放了。因此,如果函式返回的是區域性變數的值,不涉及位址,程式不會出錯。但是如果返回的是區域性變數的位址(指標)的話,程式執行後會出錯。因為函式只是把指標複製後返回了,但是指標指向的內容已經被釋放了,這樣指標指向的內容就是不可預料的內容,呼叫就會出錯。
自動變數只有三種儲存方式,分別是資料段或者bss段(靜態區域性變數);儲存在暫存器中(暫存器變數);儲存在棧中(一般的自動變數)。由於絕大多數自動變數都儲存在棧中,所以自動變數的作用域往往只在函式內,其生命週期往往只持續到函式呼叫結束。
由於指標指向的內容還留在棧幀上,函式只是將其位址返回。因此如果棧幀被其他函式覆蓋,返回的指標指向的記憶體區域的值也就消失了。如下圖
1.
char *returnstr()
這個沒有任何問題,因為"hello world!"是乙個字串常量,存放在靜態資料區,把該字串常量存放的靜態資料區的首位址賦值給了指標,所以returnstr函式退出時,該該字串常量所在記憶體不會被**,故能夠通過指標順利無誤的訪問。2.
char *returnstr()
"hello world!"是乙個字串常量,存放在靜態資料區,沒錯,但是把乙個字串常量賦值給了乙個區域性變數(char 型陣列),該區域性變數存放在棧中,這樣就有兩塊內容一樣的記憶體,這是與前著最本質的區別,當returnstr函式退出時,棧要清空,區域性變數的記憶體也被清空了,所以這時的函式返回的是乙個已被釋放的記憶體位址,所以列印出來的是亂碼。3.
char *returnstr()
沒有問題,如果函式的返回值非要是乙個區域性變數的位址,那麼該區域性變數一定要申明為static型別。可以返回乙個指向靜態區域性陣列的指標,因為靜態儲存期是從物件定義到程式結束的。4.
int func()
int * func()
區域性變數也分區域性自動變數和區域性靜態變數,由於a返回的是值,因此返回乙個區域性變數是可以的,無論自動還是靜態,因為這時候返回的是這個區域性變數的值,但不應該返回指向區域性自動變數的指標,因為函式呼叫結束後該區域性自動變數被拋棄,這個指標指向乙個不再存在的物件,是無意義的。但可以返回指向區域性靜態變數的指標,因為靜態變數的生存期從定義起到程式結束。5.
char *getmemory3(int num)
返回指向堆記憶體的指標是可以的,程式在執行的時候用 malloc 申請任意多少的記憶體,程式設計師自己負責在何時用 free釋放記憶體。總之,函式是可以返回區域性變數的,這是僅僅是區域性變數的值,不能返回區域性變數的位址(指標),準確的來說,函式不能通過返回指向棧記憶體的指標(注意這裡指的是棧,返回指向堆記憶體的指標是可以的)。 如果要想返回區域性變數的位址的話,那麼該區域性變數一定要申明為static型別。 C語言之解析區域性變數返回
一般的來說,函式是可以返回區域性變數的。區域性變數的作用域只在函式內部,在函式返回後,區域性變數的記憶體已經釋放了。因此,如果函式返回的是區域性變數的值,不涉及位址,程式不會出錯。但是如果返回的是區域性變數的位址 指標 的話,程式執行後會出錯。因為函式只是把指標複製後返回了,但是指標指向的內容已經被...
C語言 返回區域性變數
一般的來說,函式是可以返回區域性變數的。區域性變數的作用域只在函式內部,在函式返回後,區域性變數的記憶體已經釋放了。因此,如果函式返回的是區域性變數的值,不涉及位址,程式不會出錯。但是如果返回的是區域性變數的位址 指標 的話,程式執行後會出錯。因為函式只是把指標複製後返回了,但是指標指向的內容已經被...
C 函式返回區域性變數
原因 返回值是拷貝值,區域性變數的作用域為函式內部,函式執行結束,棧上的區域性變數會銷毀,記憶體釋放。可返回的區域性變數 1.返回區域性變數本身 int sum int a,int b 2.常量 char returnvalue warning deprecatedconversion from s...