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用法如下:
- 在32位處理器下,針對char a[50],要計算a陣列佔用記憶體大小:sizeof(a) = 50位元組,
如果針對int a[50],則a陣列佔用記憶體大小:sizeof(a) = 50*4=200位元組. - 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位處理器為例,用兩個簡單例子可以比較清楚兩者的區別:
已知:char a[10]=”12345”;
則:
sizeof(a) =10*sizeof(char)=10*1=10位元組長度
strlen(a)=5字元長度已知: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;
}