C語言中sizeof與strlen區別

2022-07-16 06:21:13 字數 2468 閱讀 2350

sizeof 初始的分配的空間大小,期中

sizeof(unsigned char) = 1;

sizeof(signed char) = 1;     

sizeof(int) = 4;

sizeof(unsigned int) = 4;

sizeof(short int) = 2;

sizeof(unsigned short) = 2;

sizeof(long int) = 4;

sizeof(unsigned long) = 4;

sizeof(float) = 4;

sizeof(double) = 8;

sizeof(long double) = 12;

sizeof(char *)=4;

例如: char a[5];

int b[5];

sizeof(a) = 5;

sizeof(b) = 20;

strlen是該陣列的長度:如

(1)char *  指標 

strlen(指標名) 

如果引數是指標則計算該指標指向字串行的長度。(以』\0』 作為判斷標誌)例如: 

定義char *p=「hello world」;strlen(p)=11,而 sizeof  (p)=4。可以看到 strlen

計算的是指標指向的字串的長度而sizeof 計算的是指標本身所占用的記憶體空

間的大小。 

(2)陣列 

strlen(陣列名) 

如果引數是陣列的話,實際傳遞的是乙個指標,strlen 會按照上面處理指標的模

式處理該陣列。 

我們可以看下面的例子: 

char a=」hh」; 

strlen(a); 

很顯然strlen 的結果是2。但是如果陣列是這樣賦值的呢? 

char a=; 

strlen(a); 

那麼現在strlen(a )的結果又是多少呢?這個數就不一定了,原因是 strlen 會去

計算a 位址開始的字串的長度,由於前一種賦值方式會將hh以字  符串的形式

賦值給陣列會將字串結束符』\0』 一同賦值,這時strlen 就會檢查到結束符停止

計算,而第二種復值方式是以單個字元的形式賦值沒有結束  符』\0』, 這時我們用

sizeof 得到的結果是正常的,而用 strlen 由於找不到結束符,會繼續的計算直到

找到結束符為止。所以這個數是不確定.

例項2:

char a="hello";

char b=;

strlen(a),strlen(b)的值分別是多少?

前面分析過,strlen是求字串的長度,字串有個預設的結束符/0,這個結束符是在定義字串的時候系統自動加上去的,就像定義陣列a一樣。陣列a定義了乙個字串,陣列b定義了乙個字元陣列。因此,strlen(a)=5,而strlen(b)的長度就不確定的,因為strlen找不到結束符。

one example

#define path_tmp             "12345"

static void test_sizeof_strlen()

the output result:

sizeof(msg)---4

strlen(msg)---5

sizeof(array)---6

strlen(array)---5

sizeof(path_tmp)---6

strlen(path_tmp)---5

char *c="abcdef";

char d="abcdef";

char e=;

printf("%d%d/n",sizeof(c),strlen(c));

printf("%d%d/n",sizeof(d),strlen(d));

printf("%d%d/n",sizeof(e),strlen(e));

輸出的結果是:

4 67 6

6 14

分析一下:

第一行定義c為乙個字元指標變數,指向常量字串,c裡面存放的是字串的首位址。

第二行定義d為乙個字元陣列,以字串的形式給這個字元陣列賦值。

第三行定義的也是個字元陣列,以單個元素的形式賦值。

當以字串賦值時,"abcdef",結尾自動加乙個"/0".

strlen(c)遇到/0就會結束,求的是字串的長度,為6.

sizeof(c)求的是型別空間大小,在前面說過,指標型所點的空間大小是4個位元組,系統位址匯流排長度為32位時。

strlen(d)也是一樣,字串賦值,自動新增/0,求字串的長度當然是6.

sizeof(d)是求這個陣列所佔空間的大小,即陣列所佔記憶體空間的位元組數,應該為7.

sizeof(e), 陣列e以單個元素賦值,沒有/0結束符,所以所佔空間的大小為6個位元組。

strlen(e),去找/0結尾的字串的長度,由於找不到/0,所以返回的值是乙個不確定的值。

c語言中陣列與sizeof

我以前的理解是 陣列名字就是指向陣列首元素的指標,然而用sizeof 運算元組名字,把我又弄得有些疑惑了。查了查資料,終於明白了。原來,陣列名字做形參時才被當作指標。而sizeof 並不是乙個函式,而是乙個單目運算子,所以sizeof 裡寫陣列名字,返回的就是陣列佔了多少位元組。例如 char a ...

C語言中sizeof與strlen區別

一.本質區別 sizeof 和 strlen 有本質上的區別。sizeof 是c 語言的一種單目運算子,如 等,並不是函式,sizeof 的優先順序為2 級,比 等3 級運算子優先順序高,sizeof 以位元組的形式給出運算元的儲存空間的大小。而strlen 是乙個函式,是由c 語言的標準庫提供的。...

c語言中的sizeof

一 sizeof的概念 sizeof是c語言的一種單目操作符,如c語言的其他操作符 等。它並不是函式。sizeof操作符以位元組形式給出了其運算元的儲存大小。運算元可以是乙個表示式或括在括號內的型別名。運算元的儲存大小由運算元的型別決定。二 sizeof的使用方法 1 用於資料型別 sizeof使用...