C語言 strlen與sizeof的區別


strlen是一個函數,它的參數必須是字符型指針(char *),且必須是以結束字符'\0'結尾的;
strlen的函數調用返回的是size_t類型,即結果類型是size_t類型(無符號整型);
strlen在運行時刻才能計算結果,故它計算的是字符串的長度,不是類型占內存的大小;
strlen只關心存儲的數據內容的長度,不管空間的大小與類型,即strlen計算的是空間中字符的個數(不包括'\0');
strlen(char*)函數的功能是返回字符串的實際長度,該函數實際完成的功能是從代表該字符串的第一個地址開始遍歷,直到遇到結束字符'\0',返回長度不包括'\0',
如果字符串沒有賦值,strlen(char*)返回的結果將是不定的,因為它將從該字符串的首地址一直遍歷直到遇到'\0';
當數組名作為參數傳入時,實際上數組就退化成指針了。

 

sizeof是一個單目運算符(算符/操作符/關鍵字),它是結果類型是size_t,在頭文件用typedef定義為unsigned int類型;
sizeof的參數可以是數組、指針、類型、對象、函數等,它返回的是變量聲明后所占的內存數,非實際長度,即它計算的是分配空間的實際字節數;
sizeof的功能是獲取保證能容納實現所建立的最大對象的字節大小;
sizeof是在編譯時刻計算緩沖區長度,因此sizeof不能返回動態分配的內存空間大小;
sizeof是在編譯的時候就將結果計算出來了是類型所占空間的字節數,所以數組名做參數時計算的是整個數組的大小;

當函數分別如下時,sizeof返回的值表示含義如下:
數組--編譯時分配的數組空間大小
指針--存儲該指針所用的空間大小(存儲該指針的地址的長度,如長整型,應該為4)
類型--該類型所占的空間大小
對象--對象的實際占用空間大小
函數--函數的返回類型所占的空間大小,函數返回類型不能為void

當用sizeof來返回類型以及靜態分配的對象、結構或數組所占的空間,返回值跟對象、結構、數組所存儲的內容沒有關系;
當sizeof適用於一個結構類型或變量時,sizeof 返回實際的大小;
當sizeof適用於一個靜態的空間數組, sizeof 返回全部數組的尺寸;
sizeof 操作符不能返回動態地被分派了的數組或外部的數組的尺寸;

 


#轉載內容:

1.sizeof操作符的結果類型是size_t,它在頭文件中typedef為unsigned int類型。 
該類型保證能容納實現所建立的最大對象的字節大小。

2.sizeof是算符,strlen是函數。

3.sizeof可以用類型做參數,strlen只能用char*做參數,且必須是以'\0'結尾的。 
sizeof還可以用函數做參數,比如: 
short f(); 
printf("%d\n", sizeof(f())); 
輸出的結果是sizeof(short),即2。

4.數組做sizeof的參數不退化,傳遞給strlen就退化為指針了。

5.大部分編譯程序 在編譯的時候就把sizeof計算過了 是類型或是變量的長度這就是sizeof(x)可以用來定義數組維數的原因 
char str[20]="0123456789"; //str是編譯期大小已經固定的數組
int a=strlen(str); //a=10; //strlen()在運行起確定
int b=sizeof(str); //而b=20; //sizeof()在編譯期確定

6.strlen的結果要在運行的時候才能計算出來,時用來計算字符串的長度,而不是類型占內存的大小。

7.sizeof后如果是類型必須加括弧,如果是變量名可以不加括弧。這是因為sizeof是個操作符不是個函數。

8.當適用了於一個結構類型時或變量, sizeof 返回實際的大小, 
當適用一靜態地空間數組, sizeof 歸還全部數組的尺寸。 
sizeof 操作符不能返回動態地被分派了的數組或外部的數組的尺寸

9.數組作為參數傳給函數時傳的是指針而不是數組,傳遞的是數組的首地址, 
如: 
fun(char [8]) 
fun(char []) 
都等價於 fun(char *) 
在C++里參數傳遞數組永遠都是傳遞指向數組首元素的指針,編譯器不知道數組的大小 
如果想在函數內知道數組的大小, 需要這樣做: 
進入函數后用memcpy拷貝出來,長度由另一個形參傳進去 
fun(unsiged char *p1, int len) 
{ 
unsigned char* buf = new unsigned char[len+1] 
memcpy(buf, p1, len); 
}

我們能常在用到 sizeof 和 strlen 的時候,通常是計算字符串數組的長度 
看了上面的詳細解釋,發現兩者的使用還是有區別的,從這個例子可以看得很清楚:

char str[20]="0123456789"; 
int a=strlen(str); //a=10; >>>> strlen 計算字符串的長度,以結束符 0x00 為字符串結束。 
int b=sizeof(str); //而b=20; >>>> sizeof 計算的則是分配的數組 str[20] 所占的內存空間的大小,不受里面存儲的內容改變。

上面是對靜態數組處理的結果,如果是對指針,結果就不一樣了

 char* ss = "0123456789";
  sizeof(ss) 結果 4 ===》ss是指向字符串常量的字符指針,sizeof 獲得的是一個指針的之所占的空間,應該是 長整型的,所以是4
  sizeof(*ss) 結果 1 ===》*ss是第一個字符 其實就是獲得了字符串的第一位'0' 所占的內存空間,是char類 型的,占了 1 位
  strlen(ss)= 10 >>>> 如果要獲得這個字符串的長度,則一定要使用 strlen。


————————————————
版權聲明:本文為CSDN博主「飄過的小牛」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/niushuai666/article/details/7677210

 

下面我們來看一看sizeof和strlen的具體使用:

首先看幾個例子 : 
第一個例子:
char* s = "0123456789";
sizeof(s);     //結果 4    ===》s是指向字符串常量的字符指針
sizeof(*s);    //結果 1    ===》*s是第一個字符
strlen(s);     //結果 10   ===》有10個字符,strlen是個函數內部實現是用一個循環計算到\0為止之前
strlen(*s);     //結果 10   ===》錯誤


char s[] = "0123456789";
sizeof(s);     //結果 11   ===》s是數組,計算到\0位置,因此是10+1
strlen(s);     //結果 10   ===》有10個字符,strlen是個函數內部實現是用一個循環計算到\0為止之前
sizeof(*s);    //結果 1    ===》*s是第一個字符

char s[100] = "0123456789";
sizeof(s);     //結果是100 ===》s表示在內存中的大小 100×1
strlen(s);     //結果是10  ===》strlen是個函數內部實現是用一個循環計算到\0為止之前

int s[100] = "0123456789";
sizeof(s);     //結果 400  ===》s表示再內存中的大小 100×4
strlen(s);     //錯誤      ===》strlen的參數只能是char* 且必須是以‘\0‘結尾的

char q[]="abc";
char p[]="a\n";
sizeof(q),sizeof(p),strlen(q),strlen(p);\\結果是 4 3 3 2

char p[] = {'a','b','c','d','e','f','g','h'};
char q[] = {'a','b','c','d,'\0','e','f','g'};
sizeof(p);     //結果是8 ===》p表示在內存中的大小 8×1
strlen(p);     //為一個隨機值,結果與編譯器有關,不同編譯器結果一般不同
sizeof(q);     //結果是8 ===》p表示在內存中的大小 8×1
strlen(q);     //結果為4 ===》存在'\0',遇到'\0'計算停止。



第二個例子

struct Stu
{
int i;
int j;
char k;
};
Stu stu;
printf("%d\n",sizeof(Stu));  //結果 12  ===》內存補齊
printf("%d\n",sizeof(stu));;  //結果 12  ===》內存補齊  

這個例子是結構體的內存對齊所導致的,計算結構變量的大小就必須討論數據對齊問題。為了CPU存取的速度最快(這同CPU取數操作有關,詳細的介紹可以參考一些計算機原理方面的書),C語言在處理數據時經常把結構變量中的成員的大小按照4或8的倍數計算,這就叫數據對齊(data alignment)。這樣做可能會浪費一些內存,但理論上速度快了。當然這樣的設置會在讀寫一些別的應用程序生成的數據文件或交換數據時帶來不便,如有不理解的可以看看另外關於一篇內存對齊的博客。

————————————————
版權聲明:本文為CSDN博主「Oragen」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/magic_world_wow/article/details/80500473
sizeof和strlen的具體使用
char * str = “12345”;

strlen(str) = 5, 字符串實際長度為5(不包括”/0”)

sizeof(str) = 4, str是指向字符串首地址的指針

sizeof(*str) = 1, *str是字符串的第一個字符

char arr[] = “12345”;

strlen(arr) = 5, 字符串實際長度為5(不包括”/0”)

sizeof(arr) = 6, arr是數組,計算到默認的”/0”的位置

sizeof(*arr) = 1, *arr是字符串數組的第一個字符

char arr1[100] = “12345sizeof(arr1) = 100,  arr1表示在內存中分配的大小,100x1 = 100

strlen(arr1) = 5, 字符串實際長度為5(不包括”/0”)

————————————————
版權聲明:本文為CSDN博主「小虎Sam很忙」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/lazy_tiger/article/details/2150371
strlen和sizeof的使用區別
/*判斷一*/
if(strlen(x)>= strlen(y))
{
}
/*判斷二*/
if(strlen(x)- strlen(y)>= 0)
{
}
從表面上看,上面的兩個判斷表達式完全相等,但實際情況並非如此。其中,判斷表達式一沒什么問題,程序也能夠完全按照預想的那樣工作;但判斷表達式二的結果就不一樣了,它將永遠是真,這是為什么呢?

原因很簡單,因為函數 strlen 的返回結果是 size_t 類型(即無符號整型),而 size_t 類型絕不可能是負的。因此,語句“if(strlen(x)-strlen(y)>=0)”將永遠為真。

同樣,就算表達式中同時包含了有符號整數和無符號整數,還是有可能產生意想不到的結果,如下面的代碼所示:
/*判斷一*/
if(strlen(x)>= 5)
{
}
/*判斷二*/
if(strlen(x)- 5>=0)
{
}
很顯然,判斷表達式二的結果還是永遠是真,其原因與上面相同。
strlen返回結果的使用

 

 

 

參考:
http://c.biancheng.net/view/342.html
https://blog.csdn.net/niushuai666/article/details/7677210
https://blog.csdn.net/magic_world_wow/article/details/80500473
https://blog.csdn.net/lazy_tiger/article/details/2150371
https://blog.csdn.net/leho666/article/details/89207865


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM