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

posts - 297,  comments - 15,  trackbacks - 0
char * fun(char *str)
{
memset(str, 0, sizeof(str));  //用strlen和sizeof()有什么區(qū)別
...
return str;
}
int main(int argc, char* argv[])
{
char *a, b[400];
a = fun(b);
}
strlen()和sizeof()出來的長度是不一樣的,但結(jié)果好像都一樣,memset()有那么聰明嗎?


sizeof 這個是在匯編里面就存在的一個指令,可以直接返回你要判斷的變量戰(zhàn)局的內(nèi)存的大?gt;>?br>這個是在編譯器就確定的,一個要注意的問題是,看下面的代碼
char* str=new char[100]
sizeof(str)
這個可是會返回4哦,可不是你要的400
而 char str[100]
sizeof(str)是會返回400的。
但是,無論如何strlen()都是一個函數(shù),它返回的是一個字符串的長度,也就是說從你給的字符串
首地址開始,一直到'\0'為止的這一段長度。
memset真的沒有那么智能,但是它確實高效。


strlen 返回的是實際串長
sizeof 如果*str是指針則返回 char *的大小 如果是用數(shù)組聲明 返回的是空間的大小
char *sz = "abcde";
char sz1[20] = "abcde";
cout<<sizeof(sz)<<endl;
cout<<strlen(sz)<<endl;
cout<<sizeof(sz1)<<endl;
cout<<strlen(sz1)<<endl;
輸出:
4
5
20
5


memset(str, 0, sizeof(str));  //用strlen和sizeof()有什么區(qū)別?
答:用sizeof的話,只給str所指向的內(nèi)存塊連續(xù)4個字節(jié)清0;
    用strlen的話,是給str所指向的字符串全部清0;
     
    sizeof(str)返回str這個指針變量所占的內(nèi)存字節(jié)數(shù)目;
    strlen(str) 返回str所指向的字符串的長度


sizeof()應(yīng)該是編譯時處理的。strlen是函數(shù),不一樣的


char * fun(char *str)
{
memset(str, 0, sizeof(str));  //sizeof(str))求得是指針str的大小,指針占空間是一
                                      //樣的4個字節(jié);str指向的是數(shù)組的首地址,這樣相當(dāng)于
                                     //將數(shù)組前四個元素至為‘\0’,用printf("%s")的話,遇
                                    //到第一個'\0',即退出。
                                   //如果用memset(str, 0, strlen(str));就得看運氣了,
                                  //str指向數(shù)組b[400]首地址,b[400]沒有顯示初始化,
                                 //strlen是遇到'\0'退出,有可能b[0]就是'\0'
                                //strlen(str)的結(jié)果就為0,用printf("%s")就打印不出來了;
                                //strlen(str)也有可能是其他值,得看'\0'在b[400]的哪個位置了
return str;
}
int main(int argc, char* argv[])
{
char *a, b[400];
a = fun(b);
}


char * fun(char *str)
{
memset(str, 0, sizeof(str)); //sizeof(str))求得是指針str的大小,指針占空間是一
                                  //樣的4個字節(jié);str指向的是數(shù)組的首地址,這樣相當(dāng)于
                                 //將數(shù)組前四個元素至為‘\0’,用printf("%s")的話,遇
                                //到第一個'\0',即退出。
                               //如果用memset(str, 0, strlen(str));就得看運氣了,
                              //str指向數(shù)組b[400]首地址,b[400]沒有顯示初始化,
                             //strlen是遇到'\0'退出,有可能b[0]就是'\0'
                            //strlen(str)的結(jié)果就為0,用printf("%s")就打印不出來了;
                           //strlen(str)也有可能是其他值,得看'\0'在b[400]的哪個位置了
return str;
}
int main(int argc, char* argv[])
{
char *a, b[400];
a = fun(b);
}


sizeof(str))求得是指針str的大小



strlen---------測“字符個數(shù)”(包括:不可見字符,如:空格等)
sizeof---------測“BYTE個數(shù)”


sizeof返回對象所占用的字節(jié)大小.
strlen返回字符個數(shù).
在使用sizeof時,有一個很特別的情況,就是數(shù)組名到指針蛻變,
char Array[3] = {'0'};
sizeof(Array) == 3;
char *p = Array;
sizeof(p) == 1;


在傳遞一個數(shù)組名到一個函數(shù)中時,它會完全退化為一個指針


學(xué)習(xí),一直寫代碼,對strlen和sizeof的區(qū)別比較困惑,現(xiàn)在清楚了

二者的區(qū)別:
1.sizeof操作符的結(jié)果類型是size_t,它在頭文件中typedef為unsigned int類型。
該類型保證能容納實現(xiàn)所建立的最大對象的字節(jié)大小。

2.sizeof是算符,strlen是函數(shù)。

3.sizeof可以用類型做參數(shù),strlen只能用char*做參數(shù),且必須是以''\0''結(jié)尾的。
sizeof還可以用函數(shù)做參數(shù),比如:
short f();
printf("%d\n", sizeof(f()));
輸出的結(jié)果是sizeof(short),即2。

4.數(shù)組做sizeof的參數(shù)不退化,傳遞給strlen就退化為指針了。

5.大部分編譯程序 在編譯的時候就把sizeof計算過了 是類型或是變量的長度這就是sizeof(x)可以用來定義數(shù)組維數(shù)的原因
char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;

6.strlen的結(jié)果要在運行的時候才能計算出來,時用來計算字符串的長度,不是類型占內(nèi)存的大小。

7.sizeof后如果是類型必須加括弧,如果是變量名可以不加括弧。這是因為sizeof是個操作符不是個函數(shù)。
 
8.當(dāng)適用了于一個結(jié)構(gòu)類型時或變量, sizeof 返回實際的大小,
 當(dāng)適用一靜態(tài)地空間數(shù)組, sizeof 歸還全部數(shù)組的尺寸。
 sizeof 操作符不能返回動態(tài)地被分派了的數(shù)組或外部的數(shù)組的尺寸

9.數(shù)組作為參數(shù)傳給函數(shù)時傳的是指針而不是數(shù)組,傳遞的是數(shù)組的首地址,
如:
fun(char [8])
fun(char [])
都等價于 fun(char *)
在C++里參數(shù)傳遞數(shù)組永遠(yuǎn)都是傳遞指向數(shù)組首元素的指針,編譯器不知道數(shù)組的大小
如果想在函數(shù)內(nèi)知道數(shù)組的大小, 需要這樣做:
進(jìn)入函數(shù)后用memcpy拷貝出來,長度由另一個形參傳進(jìn)去
fun(unsiged char *p1, int len)
{
  unsigned char* buf = new unsigned char[len+1]
  memcpy(buf, p1, len);
}

我們能常在用到 sizeof 和 strlen 的時候,通常是計算字符串?dāng)?shù)組的長度
看了上面的詳細(xì)解釋,發(fā)現(xiàn)兩者的使用還是有區(qū)別的,從這個例子可以看得很清楚:

char str[20]="0123456789";
int a=strlen(str); //a=10; >>>> strlen 計算字符串的長度,以結(jié)束符 0x00 為字符串結(jié)束。
int b=sizeof(str); //而b=20; >>>> sizeof 計算的則是分配的數(shù)組 str[20] 所占的內(nèi)存空間的大小,不受里面存儲的內(nèi)容改變。 

上面是對靜態(tài)數(shù)組處理的結(jié)果,如果是對指針,結(jié)果就不一樣了

char* ss = "0123456789";
sizeof(ss) 結(jié)果 4 ===》ss是指向字符串常量的字符指針,sizeof 獲得的是一個指針的之所占的空間,應(yīng)該是

長整型的,所以是4
sizeof(*ss) 結(jié)果 1 ===》*ss是第一個字符 其實就是獲得了字符串的第一位'0' 所占的內(nèi)存空間,是char類

型的,占了 1 位

strlen(ss)= 10 >>>> 如果要獲得這個字符串的長度,則一定要使用 strlen。



posted on 2008-10-21 17:17 chatler 閱讀(525) 評論(0)  編輯 收藏 引用 所屬分類: C++_BASIS
<2010年11月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺這個博客還是不錯,雖然做的東西和我不大相關(guān),覺得看看還是有好處的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧美一区二区三区在线| 亚洲区第一页| 亚洲一级二级在线| 在线观看亚洲视频啊啊啊啊| 国产精品进线69影院| 欧美成人精品一区二区三区| 午夜天堂精品久久久久| 一区二区日韩| 亚洲精品三级| 欧美风情在线| 美女脱光内衣内裤视频久久网站| 亚洲欧美日韩直播| 一本色道久久88综合亚洲精品ⅰ| 在线精品一区| 国内精品久久久久久久影视麻豆| 国产精品乱人伦一区二区| 欧美精品九九| 欧美韩国一区| 欧美大尺度在线| 久久野战av| 久久三级视频| 久久美女性网| 久久久久久久综合日本| 欧美一级在线视频| 亚洲欧美综合另类中字| 亚洲手机成人高清视频| 日韩视频一区| 一本大道久久a久久综合婷婷| 亚洲国产天堂久久综合| 欧美激情bt| 亚洲国产精品成人| 91久久线看在观草草青青| 亚洲高清视频在线观看| 亚洲第一主播视频| 亚洲区欧美区| 日韩午夜电影| 日韩一级精品视频在线观看| 亚洲精品影视| 一区二区高清在线观看| 亚洲午夜高清视频| 亚洲欧美日韩另类精品一区二区三区| 亚洲免费在线视频一区 二区| 亚洲小少妇裸体bbw| 亚洲欧美成人在线| 欧美在线一区二区三区| 久久久www| 美日韩精品免费| 欧美黄色成人网| 欧美日韩一区二区在线视频| 欧美性大战久久久久久久蜜臀| 国产精品久久久久久久免费软件| 国产精品色在线| 韩国精品一区二区三区| 永久域名在线精品| 亚洲精品欧美激情| 亚洲一区尤物| 久久视频在线看| 欧美激情一二三区| 一区二区三区高清在线| 西瓜成人精品人成网站| 老司机精品导航| 欧美日韩一区二区免费在线观看| 国产精品视频区| 激情欧美一区二区三区| 日韩网站免费观看| 欧美一区91| 欧美成人精品激情在线观看| 日韩系列在线| 久久国产精品久久w女人spa| 欧美成人小视频| 国产精品毛片a∨一区二区三区| 国产一区二区三区四区在线观看| 亚洲国产精品va在线观看黑人| 一区二区三区四区蜜桃| 久久久久久尹人网香蕉| 最新国产乱人伦偷精品免费网站 | 久久精品成人欧美大片古装| 美女视频一区免费观看| 洋洋av久久久久久久一区| 久久精品盗摄| 国产精品草莓在线免费观看| 依依成人综合视频| 亚洲综合色网站| 欧美高清日韩| 亚洲在线一区二区三区| 牛夜精品久久久久久久99黑人 | 国产午夜精品久久久| 亚洲国产免费看| 午夜天堂精品久久久久| 欧美国产高清| 香蕉av777xxx色综合一区| 欧美精品一二三| 经典三级久久| 亚洲欧美激情在线视频| 亚洲福利精品| 久久精品在线视频| 国产精品羞羞答答| 亚洲少妇在线| 亚洲电影免费观看高清| 欧美在线观看你懂的| 欧美视频中文字幕在线| 亚洲精品九九| 美日韩免费视频| 欧美亚洲一区在线| 国产精品视频一| 一区二区三区四区五区精品视频| 母乳一区在线观看| 欧美在线视屏| 国产日韩欧美一二三区| 亚洲一区三区电影在线观看| 亚洲茄子视频| 欧美91精品| 亚洲国产一二三| 欧美xx视频| 久久久久久久999精品视频| 国产欧美日本一区视频| 午夜天堂精品久久久久| 亚洲午夜国产一区99re久久| 欧美日韩精品| 一本一本久久| 日韩亚洲国产精品| 欧美日韩调教| 亚洲午夜av| 亚洲少妇在线| 国产精品视频区| 午夜精品一区二区在线观看| 在线视频精品一| 国产精品久久久久91| 亚洲一区精品电影| 在线一区亚洲| 国产精品伦子伦免费视频| 亚洲愉拍自拍另类高清精品| 99视频精品免费观看| 欧美午夜片欧美片在线观看| 亚洲免费影视第一页| 亚洲一本视频| 国产日韩欧美91| 久久视频精品在线| 久久综合久久88| 亚洲精品亚洲人成人网| 亚洲久久一区二区| 国产精品成人av性教育| 欧美一区二视频| 久久精品国产在热久久| 亚洲国产精品一区二区三区| 亚洲风情亚aⅴ在线发布| 欧美人与禽猛交乱配| 亚洲性感美女99在线| 亚洲欧美成人网| 今天的高清视频免费播放成人| 欧美a级片网站| 欧美另类人妖| 午夜精品久久久久久久久久久 | 在线免费观看日韩欧美| 亚洲高清自拍| 欧美偷拍另类| 久久午夜视频| 欧美大片免费看| 亚洲视频中文字幕| 性久久久久久| 亚洲片区在线| 亚洲一区二区欧美| 狠狠狠色丁香婷婷综合久久五月 | 在线视频国产日韩| 亚洲欧洲一区二区三区在线观看| 欧美三级在线播放| 久久久女女女女999久久| 欧美本精品男人aⅴ天堂| 亚洲天堂久久| 久久av资源网站| 亚洲美女av在线播放| 亚洲欧美激情精品一区二区| 1000部国产精品成人观看| 一本一本久久a久久精品综合麻豆| 国产精品色一区二区三区| 欧美大片在线看免费观看| 国产精品久久久免费| 欧美粗暴jizz性欧美20| 国产精品丝袜白浆摸在线| 欧美激情精品久久久六区热门| 欧美性感一类影片在线播放 | 久久综合电影| 亚洲欧美成人一区二区三区| 久久婷婷丁香| 欧美在线看片a免费观看| 欧美成人免费网| 欧美伊人久久久久久久久影院| 欧美国产精品v| 久久亚洲美女| 国产精品国产a| 亚洲国产成人午夜在线一区| 国产亚洲人成a一在线v站| 亚洲美女在线观看| 亚洲电影专区| 欧美一级电影久久| 亚洲一区二区少妇| 欧美高清免费| 久久久久久一区| 国产精品制服诱惑| 亚洲美女黄色片|