一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

形參分配內(nèi)存的問題

 sky_feiyang 2014-12-03
 
 

問題1:你是把變量傳給了函數(shù),還是把地址傳給了函數(shù)?

例: 

復(fù)制代碼
#include        <stdio.h>
#include        
<stdlib.h>
#include        
<string.h>


void
oxx(
char* dest)
{
        dest 
= (char*)malloc(30);
        strcpy(dest, 
"content has been modied");
}

void
oxx2(
char* dest)
{
        strcpy(dest, 
"content hat been modied");
}

int
main()
{
        
char*   dest;
        
char    str[30];
        dest 
= &str[0];
        strcpy(dest, 
"It's a simple");


        oxx(dest);
        printf(
"oxx dest=%s\n", dest);
        oxx2(dest);
        printf(
"oxx2 dest=%s\n", dest);
}
復(fù)制代碼

 

同樣是傳了指針給函數(shù),對指針進(jìn)行了不同的操作:

1、oxx改變的是“變量”_dest,調(diào)用函數(shù)時傳給_dest的“值”已經(jīng)被拋棄。然后對_dest重新賦值后,再對其“指向的地址單元”進(jìn)行操作。由于_dest “指向的單元”是在函數(shù)內(nèi)部申請的,所以,程序結(jié)束之后,_dest和_dest所申請的單元都會被刪除。而_dest的值又沒有通過return來返回給main。所以,它也就沒有改動dest指向單元的內(nèi)容了。

2、oxx2是對_dest“指向的單元”賦值,_dest又與dest指向相等的“地址單元”,所以,它也就是改變了dest“指向的單元”的值。

 

或者這么理解:oxx是把dest當(dāng)成一個變量;oxx2是把dest當(dāng)成一個載體,對他指向的單元進(jìn)行操作。

 

問題2:可不可以return指針,來傳遞參數(shù)?

 

我們得到的忠告是:   [不要用return語句返回指向“棧內(nèi)存”的指針,因為該內(nèi)存在函數(shù)結(jié)束時自動消亡]

 

那我們再對內(nèi)存進(jìn)行一下了解,一個由C/C++編譯的程序占用的內(nèi)存分為以下幾個部分: 
  1、棧區(qū)(stack)—   由編譯器自動分配釋放   ,存放函數(shù)的參數(shù)值,局部變量的值等。其  
  操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。  
  2、堆區(qū)(heap)   —   一般由程序員分配釋放,   若程序員不釋放,程序結(jié)束時可能由OS回  
  收   。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式倒是類似于鏈表,呵呵。  
  3、全局區(qū)(靜態(tài)區(qū))(static)—,全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的  
  全局變量和靜態(tài)變量在一塊區(qū)域,   未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另  
  一塊區(qū)域。   -   程序結(jié)束后由系統(tǒng)釋放。  
  4、文字常量區(qū)   —常量字符串就是放在這里的。   程序結(jié)束后由系統(tǒng)釋放  
  5、程序代碼區(qū)—存放函數(shù)體的二進(jìn)制代碼。 

 

例子:某前輩寫的,很詳細(xì)~~~

復(fù)制代碼
int   a = 0;   全局初始化區(qū)    
char   *p1;   全局未初始化區(qū)    
  
main()    
{    
  
int   b;   //棧    
  char   s[]   =   "abc";   //棧    
  char   *p2;   //棧    
  char   *p3   =   "123456";   //123456\0在常量區(qū),p3在棧上。    
  static   int   c   =0;   //全局(靜態(tài))初始化區(qū)    
  p1   =   (char   *)malloc(10);    
  p2   
=   (char   *)malloc(20);    //分配得來得10和20字節(jié)的區(qū)域就在堆區(qū)。    
  strcpy(p1,   "123456");   //123456\0放在常量區(qū),編譯器可能會將它與p3所指向的"123456"優(yōu)化成一個地方。    
//在strcpy執(zhí)行的時候,會為生成一個p1的副本 char* _p1,在棧中
}
復(fù)制代碼

 

 

也就是說&s[0]、&b、&*p2、&*p3是不能用return來放回給調(diào)用者的,p1,p2,p3的值,即,靜態(tài)區(qū)內(nèi)存和堆區(qū)去內(nèi)存的地址都是可以返回的。

——————
無論在哪里做什么,只要堅持服務(wù)、創(chuàng)新、創(chuàng)造價值,其他的東西自然都會來的。
 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产真人无遮挡免费视频一区| 不卡视频免费一区二区三区| 伊人色综合久久伊人婷婷| 午夜福利国产精品不卡| 91亚洲熟女少妇在线观看| 欧美人妻盗摄日韩偷拍| 久久精品色妇熟妇丰满人妻91| 日韩欧美第一页在线观看 | 亚洲中文字幕有码在线观看| 日韩少妇人妻中文字幕| 很黄很污在线免费观看| 欧美乱视频一区二区三区| 国产视频福利一区二区| 欧美加勒比一区二区三区 | 永久福利盒子日韩日韩| 夫妻性生活动态图视频| 日本道播放一区二区三区| 精品日韩av一区二区三区| 国产精品伦一区二区三区四季| 久久经典一区二区三区| 丝袜av一区二区三区四区五区 | 日本欧美视频在线观看免费| 欧美性猛交内射老熟妇| 国内欲色一区二区三区| 国产精品刮毛视频不卡| 夜色福利久久精品福利| 色一情一乱一区二区三区码| 国产视频在线一区二区| 青青草草免费在线视频| 亚洲中文字幕在线综合视频| 亚洲一区二区精品国产av| 99久久精品国产日本| 国产精欧美一区二区三区久久| 国产熟女高清一区二区| 国产免费观看一区二区| 91人妻久久精品一区二区三区| 国产成人午夜福利片片| 好吊妞视频这里有精品| 五月激情综合在线视频| 国产激情一区二区三区不卡| 丝袜诱惑一区二区三区|