天天看點

一篇搞懂sizeof和strlen的差別及案例講解

首先,關于數組初始化我将它分為三種:

  • 不完全初始化:

    int arr[5]={1,2,3}

     剩下的元素預設為0;
  • 未指定數組長度:

    int arr[]={1,2,3,4}

  • 字元串形式初始化:

    char arr[]='abcd'

可能其中有兩種初始化容易搞混,一是字元數組:char arr[4]={'a','b','c','d'};一是初始化為字元串的數組:char arr[4]='abcd'。

其實,第二種以字元串形式出現的,編譯器都會為該字元串自動添加一個0作為結束符,如在代碼中寫 "abc",那麼編譯器幫你存儲的是"abc/0",char arr[]="abc"實際上存儲的是 char arr[]={'a','b','c','\0'}',還是屬于字元數組。

弄清楚char arr[4]={'a','b','c','d'};char arr[4]='abcd'的差別後, 接下來講講sizeof和strlen的作用和差別。

sizeof()”運算符求的是字元數組的長度,而不是字元串長度。隻跟你給該字元串數組定義了多大空間有關,而跟字元串是否結束無關.如果遇到字元串,編譯時會自動在末尾增加一個 null 字元,即char arr1[]='abc\0'。

strlen:用來計算以’\0’結尾的字元串長度的函數。它并不是計算記憶體大小,僅計算字元串從開端到’\0’結尾字元的個數(不包含’\0’)。

舉個栗子:

1.1 一維數組

1.1.1 sizeof()問題

(1)整形數組

一篇搞懂sizeof和strlen的差別及案例講解

(2)字元數組

一篇搞懂sizeof和strlen的差別及案例講解

(3)初始化為字元串的數組

一篇搞懂sizeof和strlen的差別及案例講解

總結:

一個指針(或者說數組/數組元素位址)的大小在32位平台是4,64位平台是8。原因:在32位cpu上,指針能夠存儲這2^32次個位址就需要4個位元組。(1位元組=8位),64位同理;

1. 求位址的大小(數首元素位址,下一個元素位址,整個數組位址,下一個數組位址...)都是4/8位元組。

2. 求元素的大小,就看是整形還是字元,整形4個位元組,字元型1個位元組。

3. 不分char,int等類型,隻要是求位址大小,都是4/8。

1.1.2 strlen()問題

(1)字元數組

一篇搞懂sizeof和strlen的差別及案例講解

(2)初始化為字元串的數組

一篇搞懂sizeof和strlen的差別及案例講解

總結:

C 庫函數 size_t strlen(const char \*str) **接收的類型是位址char \***,從給定位址**往後尋找,從給定直到空結束字元**(不包括空結束字元),然後傳回字元串 str 的長度。

如果傳給strlen()的參數是未可知範圍的位址,strlen會**一直走下去,直到遇到"\0"為止**,‘\0’出現位置是未知的,結果就是随機值(如char arr[]={'a','b','c'},strlen(arr) 随機);

如果傳給strlen()的位址後面會出現'\0',那麼就傳回字元串的長度(char arr[]=“abc”,strlen(arr) =6);

如果傳給strlen的參數是一個具體的元素而不是一個位址,這樣會把字元a的ascii碼值97傳給strlen函數,而此函數是通路不到這個位址的,是以會程式中斷。(char arr[]={'a','b','c'},strlen(*arr) 報錯)。

以上。

繼續閱讀