成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

論C/C++函數間動態內存的傳遞

開發 后端
本文介紹的是C/C++中函數間動態內存的傳遞的問題,希望對你有幫助,一起來看。

當你涉及到C/C++的核心編程的時候,你會無止境地與內存管理打交道.這些往往會使人受盡折磨.所以如果你想深入C/C++編程,你必須靜下心來,好好苦一番.

現在我們將討論C/C++里我認為哪一本書都沒有完全說清楚,也是涉及概念細節最多,語言中最難的技術之一的動態內存的傳遞.并且在軟件開發中很多專業人員并不能寫出相關的合格的代碼.

一、引入

看下面的例子,這是我們在編寫庫函數或者項目內的共同函數經常希望的.

 

  1. void MyFunc(char *pReturn, size_t size)  
  2. {  
  3. ………   
  4. pReturn = (char *)malloc(sizeof(char) * num);  
  5. ………  

 

我們可以很明顯地看出代碼作者的意圖,他想在函數調用處聲明一個指針 char *pMyReturn=NULL;然后調用MyFunc處理并返回一段長度為size的一段動態內存.

那么作者能達到預期的效果嗎?

那么我可以告訴作者,他的程序在編譯期很幸運地通過了,可是在運行期他的程序崩潰終止.原因何在,是他觸犯了系統不可侵犯的條款:錯誤地操作內存.

二、內存操作及問題相關知識點

為了能徹底解決動態內存傳遞的問題,我們先回顧一下內存管理的知識要點.

(1)內存分配方式有三種:

  • 從靜態存儲區域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量,static變量。
  • 在棧上創建。在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置于處理器的指令集中,效率很高,但是分配的內存容量有限。
  • 從堆上分配,亦稱動態內存分配。程序在運行的時候用malloc或new申請任意多少的內存,程序員自己負責在何時用free或delete釋放內存。動態內存的生存期由我們決定,使用非常靈活。

(2)指針的操作流程

申請并初始化或設置為空:

  1. int *pInt=NULL; 

開辟空間或者使其指向對象:

  1. pInt=new Int(3);  
  2. 或者  
  3. int i=3;pint=&i; 

 

用指針(更確切地說是操作內存,在使用之前加if(pint!=NULL)或者assert(pInt!=NULL)后再使用,以防內存申請失敗的情況下使用指針):

  1. if(p!=NULL) {use pint}; 

 

釋放使用完的內存.

  1. free(pInt); 

 

置指針為空

  1. pInt=NULL;(避免野指針的出現) 

 

(3) 在函數的參數傳遞中,編譯器總是要為函數的每個參數制作臨時副本,如果參數為p的話,那么編譯器會產生p的副本_p,使_p=p; 如果函數體內的程序修改了_p的內容,就導致參數p的內容作相應的修改。這就是指針可以用作輸出參數的原因.

三、問題分析

根據上面的規則我們可以很容易分析例子中失敗的原因.

 

  1. void MyFunc(char *pReturn, size_t size)  
  2. {  
  3. ………   
  4. pReturn = (char *)malloc(sizeof(char) * num);  
  5. ………  
  6. }  
  7. void main(void){  
  8. char *pMyReturn=NULL;  
  9. MyFunc(pMyReturn,10);  

 

在MyFunc(char *pReturn, size_t size)中_pMyReturn真實地申請到了內存, _pMyReturn申請了新的內存,只是把_pMyReturn 所指的內存地址改變了,但是pMyReturn絲毫未變。所以函數MyFunc并不能輸出任何東西。事實上,每執行一次MyFunc就會泄露一塊內存,因為沒有用free釋放內存。

四、問題解決方案

函數間傳遞動態數據我們可以有三種解決方法.

方法一.如果我們是用C++編程,我們可以很方便地利用引用這個技術.我也極力推薦你用引用,因為它會使你少犯一些錯誤.以下是一個例子.

 

  1. void MyFunc(char* &pReturn,size_t size){  
  2. pReturn=(char*)malloc(size);  
  3. memset(pReturn,0x00,size);  
  4. if(size>=13)  
  5. strcpy(pReturn,"Hello World!");  
  6. }  
  7.  
  8. void main(){  
  9. char *pMyReturn=NULL;  
  10. MyFunc(pMyReturn,15);  
  11. if(pMyReturn!=NULL)  
  12. {  
  13. char *pTemp=pMyReturn;  
  14. while(*pTemp!=''\0'')  
  15. cout<<*pTemp++;  
  16. pTemp=NULL;  
  17. strcpy(pMyReturn,"AAAAAAAA");  
  18. free(pMyReturn);  
  19. pMyReturn=NULL;  
  20. }  

 

方法二.利用二級指針

 

  1. void MyFunc (char ** pReturn, size_t size)  
  2. {  
  3. * pReturn = (char *)malloc(size);  
  4. }  
  5. void main(void)  
  6. {  
  7. char * pMyReturn = NULL;  
  8. MyFunc (&pMyReturn, 100);// 注意參數是 & pMyReturn  
  9. if(pMyReturn!=NULL){  
  10. strcpy(pMyReturn, "hello");  
  11. cout<< pMyReturn << endl;  
  12. free(pMyReturn);   
  13. pMyReturn=NULL;  
  14. }} 

 

為什么二級指針就可以了.原因通過函數傳遞規則可以很容易地分析出來.我們將& pMyReturn傳遞了進去,就是將雙重指針的內容傳遞到了函數中.函數過程利用改變指針的內容,這樣pMyReturn很明顯指向了開辟的內存 .

方法三. 用函數返回值來傳遞動態內存

 

  1. char * MyFunc (void)  
  2. {  
  3. char *p =new char[20];  
  4. memset(p,0x00,sizeof(p));  
  5. return p;  
  6. }  
  7. void main(void)  
  8. {  
  9. char *str = NULL;  
  10. str = MyFunc();  
  11. if(str!=NULL)  
  12. {  
  13. strcpy(str,"Hello,baby");  
  14. cout<< str << endl;  
  15. free(str);  
  16. str=NULL;  
  17. }  

 

請注意的是函數寫成這樣的話,你是不能返回什么動態內存的,因為p指向的是字符串常量.內存在位于靜態存儲區
上分配,你無法改變.(你想要得到動態內存我們一定要看到malloc或者new).

 

  1. char * MyFunc (void)  
  2. {  
  3. char *p =”Hello World”  
  4. return p;  

 

結束語

操作內存是C/C++一個難點,我們作為專業的軟件開發人員.應該深入理解并能靈活地掌握指針和內存的操作.

責任編輯:于鐵 來源: 互聯網
相關推薦

2022-01-13 10:30:21

C語言內存動態

2024-01-29 00:30:00

C語言代碼數組

2023-11-17 14:10:08

C++函數

2010-01-27 17:16:52

C++構造函數

2010-01-26 10:42:26

C++函數

2010-01-25 09:57:39

C++函數參數

2010-02-03 15:46:15

C++函數傳遞

2010-01-19 13:43:59

C++函數

2011-06-17 16:09:04

freadfwrite

2023-11-23 12:47:03

C++函數參數

2011-04-11 09:47:50

C++內存管理

2011-04-06 16:40:27

C++構造函數

2021-06-10 08:51:57

C++指針聲明指針相關概念

2024-01-09 09:23:12

指針C++

2011-06-16 09:28:02

C++內存泄漏

2023-11-17 11:40:51

C++內存

2024-12-19 14:42:15

C++內存泄漏內存管理

2010-01-18 16:56:30

C++函數

2010-01-28 13:35:41

調用C++函數

2011-04-13 16:50:54

CC++內存
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99热欧美| 久久久久久久久99精品 | 91精品国产欧美一区二区 | 黄色av网站在线观看 | 狠狠干五月天 | 日日操视频 | 日韩精品在线看 | 午夜日韩 | 国产一区久久精品 | 免费a大片| 亚洲国产视频一区二区 | 成人影院一区二区三区 | 毛片一区| 青青操91| 91资源在线观看 | 中文精品视频 | 一色一黄视频 | 欧美日韩一 | 欧美日韩1区2区 | 香蕉视频久久久 | 亚洲男人的天堂网站 | 久久夜视频 | 中文字幕成人免费视频 | 亚洲一区二区三区桃乃木香奈 | 不卡av电影在线播放 | 一本综合久久 | 91网站在线观看视频 | h片免费看| 国产激情在线观看 | 欧美一区二区三区在线观看视频 | 欧美v在线 | 国产大学生情侣呻吟视频 | 久久r免费视频 | av第一页| 欧美中文字幕一区二区 | 日本免费黄色 | 日韩在线一区二区三区 | 日本精品久久久久久久 | 日韩一区精品 | 理论片午午伦夜理片影院 | 高清av在线|