1. 程式人生 > >sizeof和strlen區別以及使用情況分析

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;
}