• <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>
            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()應該是編譯時處理的。strlen是函數(shù),不一樣的


            char * fun(char *str)
            {
            memset(str, 0, sizeof(str));  //sizeof(str))求得是指針str的大小,指針占空間是一
                                                  //樣的4個字節(jié);str指向的是數(shù)組的首地址,這樣相當于
                                                 //將數(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ù)組的首地址,這樣相當于
                                             //將數(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ù)中時,它會完全退化為一個指針


            學習,一直寫代碼,對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.當適用了于一個結(jié)構(gòu)類型時或變量, sizeof 返回實際的大小,
             當適用一靜態(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ù)組永遠都是傳遞指向數(shù)組首元素的指針,編譯器不知道數(shù)組的大小
            如果想在函數(shù)內(nèi)知道數(shù)組的大小, 需要這樣做:
            進入函數(shù)后用memcpy拷貝出來,長度由另一個形參傳進去
            fun(unsiged char *p1, int len)
            {
              unsigned char* buf = new unsigned char[len+1]
              memcpy(buf, p1, len);
            }

            我們能常在用到 sizeof 和 strlen 的時候,通常是計算字符串數(shù)組的長度
            看了上面的詳細解釋,發(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 獲得的是一個指針的之所占的空間,應該是

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

            型的,占了 1 位

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



            posted on 2008-10-21 17:17 chatler 閱讀(516) 評論(0)  編輯 收藏 引用 所屬分類: C++_BASIS
            <2009年12月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            常用鏈接

            留言簿(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

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            欧美精品丝袜久久久中文字幕 | 色欲av伊人久久大香线蕉影院| 亚洲а∨天堂久久精品9966| 久久福利资源国产精品999| 国产激情久久久久久熟女老人| 久久精品人人槡人妻人人玩AV| 大蕉久久伊人中文字幕| 中文字幕精品无码久久久久久3D日动漫| 中文字幕日本人妻久久久免费 | 久久综合伊人77777| 久久99热只有频精品8| 香蕉久久AⅤ一区二区三区| 久久精品国产亚洲av水果派| 欧美久久一区二区三区| 91精品国产综合久久精品| 亚洲第一永久AV网站久久精品男人的天堂AV | 久久久久久精品免费看SSS| 看久久久久久a级毛片| 久久久久久毛片免费看| 国内精品久久久久影院优| 日韩欧美亚洲国产精品字幕久久久 | 久久精品亚洲福利| 色综合久久无码中文字幕| 久久无码人妻精品一区二区三区| 午夜精品久久久久久影视riav| 日本久久久久久中文字幕| 久久久久亚洲AV无码永不| 亚洲国产精品无码久久SM | 久久婷婷午色综合夜啪| 久久免费视频一区| 久久久久久一区国产精品| 久久最新精品国产| 91精品久久久久久无码| 久久精品国产亚洲av日韩| 色综合久久无码五十路人妻| 亚洲午夜久久久影院| 天天躁日日躁狠狠久久| 久久夜色精品国产噜噜亚洲AV| 久久精品人人做人人妻人人玩| 久久精品无码午夜福利理论片| 国产精品久久久久久久|