關於sizeof和strlen的使用

關於sizeof和strlen經常容易搞混淆,特別是初學者。

 

先看一個關於sizeof的應用的實例:

    寫出下面程序的答案:

        

       

 

        答案:4,11,100,400,4,3,4,6,8,4,4

        1、ss1是一個指針,指針的大小是一個定值,就是4.

        2、ss2是一個字符數組,這個數組的出事大小未定,有具體的值來定。再加上字符串的是以'\0'結束的,所以sizeof(ss2)的大小爲11.

        3、ss3是一個給定確定大小的數組,因爲是char型數組,所以其大小爲100*1;

        4、ss4和ss3是一樣的,只是ss4是int型數組,其大小爲100*4;

        5、q1、q2和ss2是一樣的,只是有一點要注意,'\n'是佔一個字節的。

        6、q3和ss1是一樣的,q1是指針,其大小固定的。

        7、A、B爲結構體,在默認情況下,爲了方便對結構體內元素的訪問和管理,結構體的長度一定是最長的數據元素的整數倍。

        8、空結構體的大小爲1,空類的大小也爲1.

 

sizeof和strlen的兩者的區別:

        1、sizeof操作符的類型是size_t,在頭文件定義爲unsigned int類型,

        2、sizeof是關鍵子,strlen是函數

        3、sizeof可以用作類型參數,strlen只能用char *做參數,且必須是以'\0'結尾的,sizeof還可以用函數做參數.

        short f()

        printf("%d\n",sizeof(f()));

        4、數組做sizeof的參數不退化,傳遞給strlen就退化爲指針了。

        5、大部分程序在編譯的時候就把sizeof計算過了,是類型或是變量的長度。

        6、strlen的結果要在運行的時候才能計算出來,用來計算字符串的長度,而不是類型佔用的內存大小。

        7、sizeof後如果是類型必須加括號,如果是變量名可以不加括號,這是因爲sizeof是操作符不是函數。

        8、當使用了一個結構類型或變量時,sizeof返回實際的大小。當使用一個靜態空間數組時,sizeof返回全部數組的尺寸。sizeof操作符不能返回被動態分配的數組或外部的數組的尺寸。

        9、數組作爲參數傳給函數時傳的是指針而不是數組,傳遞的是數組的首地址。在C++中,傳遞數組永遠都是傳遞指向數組首元素的指針,編譯器不知道數組的大小。如果要在函數內知道數組的大小,需要這樣做,進入函數後,調用memcpy將數組拷貝進來,長度由另一個參數傳進去。代碼如下:

                fun (unsigned char *pl, int len)

                {

                        unsigned char *buf = new unsigned char[len+1];

                        memcpy(buf,pl,len);

                }

        10、sizeof操作符不能用於函數類型、不完全類型或位字段。不完全類型指具有未知存儲大小數據的數據類型,如未知存儲大小的數組類型、未知內容的結構或聯合類型、void類型。

        

sizeof的使用場合:

        1、sizeof操作符的一個主要用途是與存儲分配和IO系統那樣的例程進行通信。

        2、用它可以看看某種類型的對象在內存中所佔的單元字節。

        3、在動態分配內存時,可以讓系統知道要分配多少內存。

        4、便於一些類型的擴充。

        5、由於操作數的字節數在實現時可能出現變化,建議在涉及到操作數字節大小時用sizeof代替常量計算。

            6、如果操作數是函數中的數組形參或函數類型的形參,sizeof給出氣指針的大小。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章