C語言中的strlen與sizeof的區別
sizeof與strlen是有著本質的區別,sizeof是求資料型別所佔的空間大小,而strlen是求字串的長度,字串以/0結尾。區別如下:
(1) sizeof是一個C語言中的一個單目運算子,而strlen是一個函式,用來計算字串的長度。
(2)sizeof求的是資料型別所佔空間的大小,而strlen是求字串的長度
例項1:
printf("char=%d/n",sizeof(char)); //1
printf("char*=%d/n",sizeof(char*)); //4
printf("int=%d/n",sizeof(int)); //4
printf("int*=%d/n",sizeof(int*)); //4
printf("long=%d/n",sizeof(long)); //4
printf("long*=%d/n",sizeof(long*)); //4
printf("double=%d/n",sizeof(double)); //8
printf("double*=%d/n",sizeof(double*)); //4
可以看到,char佔1個位元組,int佔4個位元組,long點4個位元組,而double佔8個位元組。但 char*,int*,long*,double*都佔4個位元組的空間。
這是為什麼呢?
在C語言中,char,int,long,double這些基本資料型別的長度是由編譯器本身決定的。而char*,int*,long*,double*這些都是指標,回想一下,指標就是地址呀,所以裡面放的都是地址,而地址的長度當前是由地址匯流排的位數決定的,現在的計算機一般都是32位的地址匯流排,也就佔4個位元組。
例項2:
char a[]="hello";
char b[]={'h','e','l','l','o'};
strlen(a),strlen(b)的值分別是多少?
前面分析過,strlen是求字串的長度,字串有個預設的結束符/0,這個結束符是在定義字串的時候系統自動加上去的,就像定義陣列a一樣。陣列a定義了一個字串,陣列b定義了一個字元陣列。因此,strlen(a)=5,而strlen(b)的長度就不確定的,因為strlen找不到結束符。
下面是網上的一個比較經典的例子,分析一下:
char *c="abcdef";
char d[]="abcdef";
char e[]={'a','b','c','d','e','f'};
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 6
7 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,所以返回的值是一個不確定的值。
相關文章
- sizeof與strlen的區別
- 解析C語言中的sizeofC語言
- c語言中sizeof詳解C語言
- 求陣列長度的兩種方法,以及區別(strlen sizeof)陣列
- C語言中Pointer, Array,String and Structures的區別C語言Struct
- c語言中作用域和儲存期的區別C語言
- C語言中pi=&j和*pi=j的區別C語言
- Python語言中/與//的區別是什麼?Python
- C語言中的資料型別C語言資料型別
- Java與C語言的區別?JavaC語言
- C++語言中 *與&的作用分別是什麼啊?C++
- 《細說PHP》中strlen和mb_strlen的區別PHP
- c語言中的變數儲存區域C語言變數
- Python語言中__init__與__new__的區別是什麼?Python
- C語言與嵌入式C語言的區別C語言
- c語言中陣列的三種型別C語言陣列型別
- C語言中的#和##C語言
- sizeof和strlen計算陣列型別和指標型別字串陣列型別指標字串
- c語言中陣列的宣告喝初始化的區別和聯絡C語言陣列
- c 語言中巨集定義和定義全域性變數的區別變數
- C語言中迴圈語句while 中判斷條件出現 || 和 && 的區別C語言While
- c語言中的作用域C語言
- C語言中extern的用法C語言
- 【C】 30_C語言中的字串C語言字串
- 65.C指標---sizeof()函式和strlen()函式常見考指標函式
- c語言中預設引數的兩種型別C語言型別
- 對C語言中無符號型別的建議C語言符號型別
- c語言中陣列的宣告與初始化C語言陣列
- GO語言中string和[]byte的區別及轉換Go
- python語言中類和函式的作用及區別!Python函式
- c與c++的區別C++
- static在C語言中的作用C語言
- C 語言中的 sscanf 詳解
- C 語言中的 time 函式函式
- c語言中的getchar()和EOFC語言
- c語言中 *p++ 和 (*p)++ 有什麼區別?以及C語言運算子的優先順序。整理。C語言
- Python語言中=和==有什麼區別?Python
- C語言中幾種報錯型別的解決方案C語言型別
- c語言中的資料型別的自動轉換原則C語言資料型別