sizeof和strlen區別以及使用情況分析

實際做開發項目中,如果有涉及到字符數據處理等情況,都會遇到數據長度的獲取。比如現在需要對a[50]數組進行賦值1~50的指定數據,代碼如下:

char a[50];
for(i = 0 ; i <50 ; i++)
{
    a[i]=i+1;
}

如果50長度未知的情況,又應該如何爲數組賦值?想到的就是獲取數組長度(元素個數)然後再賦值(解決方法見文末)。C標準函數庫有自帶獲取數據長度的函數:sizeof和strlen。但用這兩函數還是有區別的。


sizeof

sizeof 並不是一個函數,而是操作符(operator),其作用就是返回一個對象的內存或者一個類型所佔用的字節數
上面提到所佔用的字節數對同一種類型在不同位數處理器的字節數是不一樣的,這個要切記。下表是總結不同類型在不同處理器下的佔用字節數。
這裏寫圖片描述

因此sizeof用法如下:

  1. 在32位處理器下,針對char a[50],要計算a數組佔用內存大小:sizeof(a) = 50字節,
    如果針對int a[50],則a數組佔用內存大小:sizeof(a) = 50*4=200字節.
  2. sizeof也可以直接計算某個類型的字節數,如在16位處理器中sizeof(int)=2字節;在32位處理器中sizeof(int)=4字節。

strlen

strlen用於專門處理處理字符串,返回字符串的字符長度的,strlen是一個函數,不是操作符。其形參只能是char*型。用法如下:

如針對一個字符串數組:
char a[10]=”12345”;
則使用函數:strlen(a)=5。字符串長度爲5。

雖然數組長度佔用內存爲10,當實際存儲字符串只有5個。strlen將數組進行遍歷,直到結束符’\0’才結束計算。

兩者區別分析與使用

以上對sizeof和strlen的描述,讀者對這兩個也有了基本瞭解。以32位處理器爲例,用兩個簡單例子可以比較清楚兩者的區別:

  1. 已知:char a[10]=”12345”;
    則:
    sizeof(a) =10*sizeof(char)=10*1=10字節長度
    strlen(a)=5字符長度

  2. 已知:int a[10]={11,22, 33,44,55};
    則:
    sizeof(a) =10*sizeof(int)=10*4=40字節長度
    strlen(a)無法使用,針對char型字符。

因此區別總結如下:

sizeof返回的是內存的字節長度,和數組元素個數無關,和數組定義的元素個數以及處理器位數有關。

strlen只針對字符串,計算字符串內字符的個數,與數組定義的元素個數無關。

再回到文章開頭的問題:現在需要對a[length]數組進行賦值1~length的指定數據(其中並不清楚length的值)。應該採用sizeof比較合理(無論幾位處理器)。

//sizeof(a)/sizeof(char)相當於獲取到了數組長度(元素個數)
for(i = 0 ; i <sizeof(a)/sizeof(char) ; i++)
{
    a[i]=i+1;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章