青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

兔子的技術博客

兔子

   :: 首頁 :: 聯系 :: 聚合  :: 管理
  202 Posts :: 0 Stories :: 43 Comments :: 0 Trackbacks

留言簿(10)

最新評論

閱讀排行榜

評論排行榜

By zieckey (http://blog.chinaunix.net/u/16292/index.html)
問題的引入:
看看下面的程序的輸出:

#include <stdio.h>
char *returnStr()
{
    char *p="hello world!";
    return p;
}
int main()
{
    char *str;
    str=returnStr();
    printf("%s\n", str);
    
    return 0;
}


這個沒有任何問題,因為"hello world!"是一個字符串常量,存放在靜態數據區,
把該字符串常量存放的靜態數據區的首地址賦值給了指針,
所以returnStr函數退出時,該該字符串常量所在內存不會被回收,故能夠通過指針順利無誤的訪問。

但是,下面的就有問題:

#include <stdio.h>
char *returnStr()
{
    char p[]="hello world!";
    return p;
}
int main()
{
    char *str;
    str=returnStr();
    printf("%s\n", str);
    
    return 0;
}

"hello world!"是一個字符串常量,存放在靜態數據區,沒錯,
但是把一個字符串常量賦值給了一個局部變量(char []型數組),該局部變量存放在棧中,
這樣就有兩塊內容一樣的內存,也就是說“char p[]="hello world!";”這條語句讓“hello world!”這個字符串在內存中有兩份拷貝,一份在動態分配的棧中,另一份在靜態存儲區。這是與前著最本質的區別,
當returnStr函數退出時,棧要清空,局部變量的內存也被清空了,
所以這時的函數返回的是一個已被釋放的內存地址,所以打印出來的是亂碼。

如果函數的返回值非要是一個局部變量的地址,那么該局部變量一定要申明為static類型。如下:

#include <stdio.h>
char *returnStr()
{
    static char p[]="hello world!";
    return p;
}
int main()
{
    char *str;
    str=returnStr();
    printf("%s\n", str);
    
    return 0;
}


這個問題可以通過下面的一個例子來更好的說明:

#include <stdio.h>
//返回的是局部變量的地址,該地址位于動態數據區,棧里

char *s1()
{
    char* p1 = "qqq";//為了測試‘
char p[]="Hello world!"’中的字符串在靜態存儲區是否也有一份拷貝
    char p[]="Hello world!";
    char* p2 = "w";
//為了測試‘char p[]="Hello world!"’中的字符串在靜態存儲區是否也有一份拷貝
    printf("in s1 p=%p\n", p);
    printf("in s1 p1=%p\n", p1);
    printf("in s1: string's address: %p\n", &("Hello world!"));
    printf("in s1 p2=%p\n", p2);
    return p;
}


//返回的是字符串常量的地址,該地址位于靜態數據區

char *s2()
{
    char *q="Hello world!";
    printf("in s2 q=%p\n", q);
    printf("in s2: string's address: %p\n", &("Hello world!"));
    return q;
}

//返回的是靜態局部變量的地址,該地址位于靜態數據區

char *s3()
{
    static char r[]="Hello world!";
    printf("in s3 r=%p\n", r);
    printf("in s3: string's address: %p\n", &("Hello world!"));
    return r;
}

int main()
{
    char *t1, *t2, *t3;
    t1=s1();
    t2=s2();
    t3=s3();
    
    printf("in main:");
    printf("p=%p, q=%p, r=%p\n", t1, t2, t3);

    printf("%s\n", t1);
    printf("%s\n", t2);
    printf("%s\n", t3);
    
    return 0;
}

運行輸出結果:

in s1 p=0013FF0C
in s1 p1=00431084
in s1: string's address: 00431074
in s1 p2=00431070
in s2 q=00431074
in s2: string's address: 00431074
in s3 r=00434DC0
in s3: string's address: 00431074
in main:p=0013FF0C, q=00431074, r=00434DC0
$?
Hello world!
Hello world!


這個結果正好應證了上面解釋,同時,還可是得出一個結論:
字符串常量,之所以稱之為常量,因為它可一看作是一個沒有命名的字符串且為常量,存放在靜態數據區。
這里說的靜態數據區,是相對于堆、棧等動態數據區而言的。
靜態數據區存放的是全局變量和靜態變量,從這一點上來說,字符串常量又可以稱之為一個無名的靜態變量,
因為"Hello world!"這個字符串在函數 s1和s2 中都引用了,但在內存中卻只有一份拷貝,這與靜態變量性質相當神似。

具體可以參考下面的幾篇博文:
http://blog.chinaunix.net/u/16292/showart_661593.html
http://blog.chinaunix.net/u/16292/showart_664550.html
http://blog.chinaunix.net/u/16292/showart_665487.html


轉自:http://zxffl.blog.163.com/blog/static/2590976200931210125220/
posted on 2011-03-22 12:02 會飛的兔子 閱讀(575) 評論(0)  編輯 收藏 引用 所屬分類: C++及開發環境
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品理论片| 欧美日韩国产经典色站一区二区三区| 亚洲精品日产精品乱码不卡| 国产精品免费观看在线| 欧美视频久久| 国产精品毛片va一区二区三区| 国产精品福利网站| 国产精品久久久久久久久果冻传媒| 久久久最新网址| 免费精品99久久国产综合精品| 免费看亚洲片| 欧美日本在线| 国产日韩欧美精品| 亚洲国产精品一区二区第四页av | 国产精品日韩欧美一区二区三区| 欧美色网一区二区| 国内一区二区三区在线视频| 最新中文字幕一区二区三区| 亚洲午夜影视影院在线观看| 欧美一区二区视频在线观看2020| 乱中年女人伦av一区二区| 欧美激情女人20p| 中文精品视频一区二区在线观看| 久久久久久久国产| 欧美日韩一区国产| 尤物九九久久国产精品的分类| 亚洲美女电影在线| 久久久久九九视频| 99re这里只有精品6| 午夜精品影院| 久久久久国产免费免费| 亚洲激情在线视频| 99香蕉国产精品偷在线观看| 欧美自拍偷拍| 国产精品色网| 一区二区高清在线观看| 久久偷看各类wc女厕嘘嘘偷窃| 最新中文字幕亚洲| 久久动漫亚洲| 国产精品综合| 亚洲一区欧美一区| 亚洲欧洲日韩在线| 久久亚洲风情| 国产亚洲一本大道中文在线| 中文亚洲欧美| 亚洲精品婷婷| 欧美大片免费观看在线观看网站推荐| 国产精品免费视频xxxx| 在线一区二区三区做爰视频网站| 噜噜噜躁狠狠躁狠狠精品视频 | 性欧美暴力猛交69hd| 亚洲国产一区二区a毛片| 久久久999精品| 国产亚洲va综合人人澡精品| 亚洲中午字幕| 亚洲精品永久免费| 欧美日本三级| 在线一区观看| 在线亚洲高清视频| 国产精品v欧美精品v日本精品动漫| 日韩亚洲视频在线| 亚洲国产一区二区三区高清| 欧美高清日韩| 一本色道久久综合亚洲精品按摩| 91久久精品视频| 欧美日韩大陆在线| 亚洲欧美春色| 久久国产黑丝| 在线激情影院一区| 亚洲国产成人午夜在线一区| 欧美**人妖| 亚洲神马久久| 亚洲专区一区二区三区| 国产欧美日韩视频| 久久综合九色99| 免费成人在线观看视频| 亚洲免费福利视频| 亚洲毛片一区| 国产日韩欧美一区在线| 裸体素人女欧美日韩| 欧美大片免费观看| 亚洲影视在线播放| 亚洲欧美网站| 最新中文字幕亚洲| 在线亚洲国产精品网站| 国产亚洲欧美aaaa| 亚洲第一天堂av| 在线一区二区日韩| 久久综合九色99| 欧美福利视频一区| 亚洲永久免费视频| 久久久久久夜精品精品免费| 最近中文字幕日韩精品| 亚洲精品中文字| 欧美电影免费观看大全| 亚洲国产欧美日韩| 亚洲欧洲另类| 国产精品一二三四| 欧美成人一区二区在线| 欧美午夜精品久久久久久人妖| 久久精品国产第一区二区三区| 久久影院亚洲| 午夜精品福利一区二区三区av| 久久成人18免费观看| 亚洲精品综合精品自拍| 欧美一区二区三区免费大片| 亚洲欧洲日产国产综合网| 一区二区三区日韩| 91久久精品一区二区三区| 亚洲在线日韩| 亚洲先锋成人| 欧美成人午夜激情| 久久综合伊人77777麻豆| 国产精品a久久久久| 欧美激情第二页| 狠狠色伊人亚洲综合成人| 亚洲天堂免费观看| 日韩一二在线观看| 久久综合色影院| 久久精品视频在线看| 国产精品久久久久久久午夜| 亚洲黄一区二区三区| 精品成人在线| 欧美一区二区私人影院日本 | 久久久久国产精品一区| 国产精品久久久久7777婷婷| 亚洲激情在线视频| 亚洲国语精品自产拍在线观看| 久久av在线看| 久久久夜夜夜| 伊人成人在线| 美女爽到呻吟久久久久| 美女网站在线免费欧美精品| 国产一区欧美日韩| 久久激情五月丁香伊人| 久久精视频免费在线久久完整在线看| 国产精品普通话对白| 亚洲欧美国产精品桃花| 性欧美暴力猛交69hd| 国产日韩欧美在线看| 欧美日韩一区二区精品| 欧美国产亚洲另类动漫| 激情成人在线视频| 久久狠狠婷婷| 乱中年女人伦av一区二区| 国内精品久久久久国产盗摄免费观看完整版 | 欧美三级中文字幕在线观看| 亚洲精品国久久99热| 精品动漫一区| 欧美视频二区36p| 日韩一区二区电影网| 亚洲午夜精品久久久久久app| 欧美系列一区| 欧美一区二区视频在线观看2020| 久久久国产一区二区三区| 精品电影一区| 欧美区一区二区三区| 亚洲午夜精品久久| 欧美亚洲在线播放| 国内精品免费午夜毛片| 老鸭窝毛片一区二区三区| 亚洲欧洲一区二区三区| 亚洲欧美三级伦理| 韩日欧美一区| 欧美国产日韩精品| 亚洲免费视频一区二区| 欧美电影免费观看网站| 亚洲视频在线看| 国语精品一区| 欧美日韩a区| 欧美自拍偷拍午夜视频| 亚洲欧洲日产国码二区| 久久激情综合| 日韩五码在线| 国产日韩欧美亚洲| 欧美理论在线播放| 久久er精品视频| 9人人澡人人爽人人精品| 久久久免费av| 午夜精品美女久久久久av福利| 韩国一区二区三区美女美女秀| 欧美精品一区二区三区蜜桃| 欧美一区二区在线视频| 日韩视频一区二区三区| 免费亚洲网站| 亚久久调教视频| 夜夜爽av福利精品导航| 伊人久久亚洲影院| 国产精品免费网站| 欧美日韩国产小视频在线观看| 欧美在线短视频| 亚洲午夜伦理| 亚洲精品综合精品自拍| 免费在线欧美视频| 久久激情综合网| 欧美一区二区在线免费观看| 国产精品99久久久久久久vr| 亚洲第一精品夜夜躁人人躁| 国产精品日韩欧美| 欧美午夜精品|