sizeof和strlen的区别(其中涉及NUL的讲解)
本文是自己結合平時所學的知識,對sizeof和strlen的區別進行了總結,如有不對的地方還請批評指證,共同進步!!!
一、從C語言的定義上來講
1、sizeof是關鍵字,而strlen是包含在string.h頭文件中的一個字符串函數
2.sizeof操作符的結果類型是size_t,它在頭文件中的typedef為unsigned int 類型,該類型保證能容納實現所建立的最大對象的字節大小。
而string函數的返回類型是整形,返回的是字符串的起始到第一個‘NUL’的所占字節的個數
3.sizeof可以用類型做參數,strlen只能用char*做參數,且必須是以”\0”結尾的。
4.大部分編譯程序在編譯的時候就把sizeof計算過了(所以sizeof的值是常量,不能出現在表達式的左邊),是類型或是變量的長度,這就是sizeof(x)可以用來定義數組位數的原因。
?
二、從功能上來講?
1.strlen的結果要在運行的時候才能計算出來,用來計算字符串的長度,而不是類型占內存的大小。
2.sizeof后如果是類型必須加括號,如果是變量名可以不加括號。這是因為sizeof是個操作符而不是函數。
?3.當使用一個結構類型或變量時,sizeof返回實際的大小。當使用一靜態的空間數組時,sizeof返回全部數組的尺寸。
Sizeof操作符不能返回被動態分配的數組或外部的數組的尺寸。
4.sizeof操作符不能用于函數類型,不完全類型或位字段。
(不完全類型指具有未知存儲大小數據的數據類型,如未知存儲大小的數組類型,未知內容的結構或聯合類型,void類型等。)
三、從它們的實現上來講(自己推導的,估計是這樣,如有錯誤,請批評指正)
strlen是遇到0退出,注意:0和 '0' 不同(涉及NUL的解釋,請看下面關于的NUL的解釋)
而sizeof則是考慮數組的實際所占的存儲空間,在程序編譯期已被確定下來了
?
易錯點及誤區:
很多人都會有個潛意識:對同一數組操作,strlen的返回值肯定比sizeof的返回值小1,(很顯然,這是錯的,請看下面的例子)具體的解釋看程序分析
?
附源碼:
#include <stdio.h> #include <string.h>int main() {char a[]={'0','1','2',0,'3'};printf("the size is :%d\n",sizeof(a));printf("the size is :%d\n",strlen(a));return 0; }程序的運行結果:
NUl的定義
C語言中規定以字符‘\0'作為字符串結束標志。’\0'是一個ASCII碼為0的字符,從ASCII碼表中可以看到ASCII碼為0的字符是“空操作字符”,
它不引起任何控制動作,也不是一個可顯示的字符
?
對于程序的分析:
strlen是遇到0(及NUL)退出,上面的程序中strlen函數在遇到0時及數組中第四個元素時即退出了,故而返回的是值3
而sizeof則是考慮數組的實際所占的存儲空間,在編譯器編譯期間已經定下來了,數組的實際的所占的存儲的空間是5個字節,故而程序打印出5
??
轉載于:https://www.cnblogs.com/linuxhan/archive/2012/12/09/3017177.html
總結
以上是生活随笔為你收集整理的sizeof和strlen的区别(其中涉及NUL的讲解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lua# lua5.1.4 源码文件作用
- 下一篇: 我喜欢的类型