C 函式返回區域性變數

2021-08-26 15:02:50 字數 1630 閱讀 4492

原因:返回值是拷貝值,區域性變數的作用域為函式內部,函式執行結束,棧上的區域性變數會銷毀,記憶體釋放。

可返回的區域性變數:

1.返回區域性變數本身

int sum(int a, int b)

2.常量:

char* returnvalue()  

warning:deprecatedconversion from string constant to 'char*' [-wwrite-strings]| 推薦把型別修改為const char * 也就是說,這種語法的存在,只是為了保證以前的c**可以正常編譯。

//錯誤

char* returnvalue()  

str 為區域性變數的引用

3.靜態區域性變數

當多次呼叫乙個函式且要求在呼叫之間保留某些變數的值時,可考慮採用靜態區域性變數。雖然用全域性變數也可以達到上述目的,但全域性變數有時會造成意外的***,因此仍以採用區域性靜態變數為宜。

//正確

char* returnvalue()  

強制定義為靜態型別;

int* returnvalue()  

;     return value;  

}

陣列名是不就變數的首位址,加上static 可以

4.堆記憶體中的區域性變數

//正確

int *sum(int a, int b)

char* newmemory(int size)    ​

int _tmain(int argc, _tchar* argv)  

std::cout<<*p;  

delete p;  

return 0;  

}

在函式內new空間,在函式外delete空間。函式內申請空間,呼叫後釋放空間。但這不是一種好的程式設計習慣,盡量在同一作用域內進行new和 delete操作。介面不靈活

五大記憶體分割槽(貌似與編譯原理中不一樣,不過道理是一樣的,實際存在的東西總是會與理論有一定差距的)

1.在c++中,記憶體分成5個區,他們分別是堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區。

2.棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數、函式引數等。

3.堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個new就要對應乙個delete。如果程式設計師沒有釋放掉,那麼在程式結束後,作業系統會自動**。

4.自由儲存區,就是那些由malloc等分配的記憶體塊,他和堆是十分相似的,不過它是用free來結束自己的生命的。

5.全域性/靜態儲存區,全域性變數和靜態變數被分配到同一塊記憶體中,在以前的c語言中,全域性變數又分為初始化的和未初始化的,在c++裡面沒有這個區分了,他們共同占用同一塊記憶體區。

6.常量儲存區,這是一塊比較特殊的儲存區,他們裡面存放的是常量,不允許修改(當然,你要通過非正當手段也可以修改,而且方法很多)

C 函式返回區域性變數

目錄2 可返回的區域性變數 示例 int get 或 char getmemory void 示例 int sum int a,int b 常量 char getmemory void 示例 const char getmemory void 或者int returnvalue return val...

函式返回區域性變數

一般的來說,函式是可以返回區域性變數的。區域性變數的作用域只在函式內部,在函式返回後,區域性變數的記憶體已經釋放了。因此,如果函式返回的是區域性變數的值,不涉及位址,程式不會出錯。但是如果返回的是區域性變數的位址 指標 的話,程式執行後會出錯。因為函式只是把指標複製後返回了,但是指標指向的內容已經被...

函式返回區域性變數

函式返回區域性變數 一般的來說,函式是可以返回區域性變數的。區域性變數的作用域 只在函式內部,在函式返回後,區域性變數的記憶體已經釋放了。因此,如果函式返回的是區域性變數的值,不涉及位址,程式不會出錯。但是如果返回的是區域性變數的位址 指標 的話,程式執行後會出錯。因為 函式只是把指標複製後返回了,...