實際做開發項目中,如果有涉及到字符數據處理等情況,都會遇到數據長度的獲取。比如現在需要對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;
}