1. 程式人生 > 程式設計 >C語言中sizeof()與strlen()的區別詳解

C語言中sizeof()與strlen()的區別詳解

前言

sizeof()和strlen()經常會被初學者混淆,但其中有有很大區別:

sizeof()

1. sizeof()【運算元所佔空間的位元組數大小】是一種c中的基本運算子。

可以以型別、指標、陣列和函式等作為引數。

標頭檔案型別為unsigned int。

運算值在編譯的時候就出結果,所以可以用來定義陣列維數。

char a[5]="123";
int b=sizeof(a);//b=5
int c=strlen(a);//c=3

C語言中sizeof()與strlen()的區別詳解

sizeof()是一種單目操作符,是用來計算你所使用的運算元所佔的空間位元組大小。

strlen

2.strlen()[計算字串的長度]是一種函式。

'\0'作為終止符;

strlen的結果執行的時候才出來(不是編譯期求值),是計算字串長度的。

其引數必須是字元型指標(char*)。

標頭檔案為#include<string.h>

size_t strlen(const char *str)//size_t()

C語言中sizeof()與strlen()的區別詳解

以下是一些具體的例項(vs2013 設定為32位):

int main()
{
	char *p = "hello";
	char arr1 []= "hello";
	char arr2[] = { 'h','e','l','o' };
	printf("%d\n",sizeof( p));
	//結果4,因為指標變數的所佔空間大小僅僅和作業系統位數有關32-4,64-8
	printf("%d\n",sizeof(arr1));
	//結果6,字串預設以\0結尾,sizeof()包含\0的計算
	printf("%d\n",sizeof(arr2));
	//結果為5,因為為字元型表示,並不含有\0(僅僅字串有\0)
	printf("%d\n",strlen( p));
	//結果為5,strlen求的是字串的長度,不包含\0
	printf("%d\n",strlen(arr1));
	//結果為5,strlen求的是字串的長度,不包含\0
	printf("%d\n",strlen(arr2));
	//因為字元型不包含\0,但字串需要找到\0才可結束,所以在'o'之後繼續向後讀取直到找到\0,所以是一個隨機值

程式執行結果如上

結果如上;

C語言中sizeof()與strlen()的區別詳解

設定為32位作業系統

後補一個注意事項:

#include <stdio.h>
int main()
{
 int arr[] = {1,2,(3,4),5};//整型陣列
 printf("%d\n",sizeof(arr));
 return 0;
}

C語言中sizeof()與strlen()的區別詳解

注意陣列的資料型別,char只佔一個位元組,而int 資料型別四個位元組哦,別忘了*4。前面的例子是char的。

#include <stdio.h>
int main()
{
 char arr[] = {1,5};//字元型
 printf("%d\n",sizeof(arr));
 return 0;
}

C語言中sizeof()與strlen()的區別詳解

大量案例(想深入瞭解可以看)

2020年11月19日補充:

補充幾個題:

1.(花括號int的sizeof())

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int arr[] = { 1,3,4 };
	printf("%d\n",sizeof(arr)); // 16
	printf("%d\n",sizeof(arr + 0)); // 4 求 sizeof(int*)
	printf("%d\n",sizeof(*arr)); // 4,求 sizeof(int)
	printf("%d\n",sizeof(arr + 1)); // 4,求 sizeof(int*)
	printf("%d\n",sizeof(arr[1])); // 4,sizeof(&arr));// 4,求 sizeof(int(*)[4]);
	printf("%d\n",sizeof(*&arr));// 16,求 sizeof(int[4]);
	printf("%d\n",sizeof(&*arr));// 4,sizeof(&arr + 1)); // 4,求 sizeof(int(*)[4])
	printf("%d\n",sizeof(&arr[0])); // 4,sizeof(&arr[0] + 1)); // 4,求 sizeof(int*)
	system("pause");
	return 0;
}

花括號定義不帶'\0',所以求strlen就是未定義行為,所以就只有sizeof().

2.(花括號char的sizeof())

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char arr[] = { 'a','b','c','d','f' };
	printf("%d\n",sizeof(arr)); // 6,sizeof(char[6])
	printf("%d\n",sizeof(arr + 0)); // 4,sizeof(char*)
	printf("%d\n",sizeof(*arr)); // 1,sizeof(char)
	printf("%d\n",sizeof(arr + 1)); // 4
	printf("%d\n",sizeof(arr[1]));// 1,sizeof(char(*)[6])
	printf("%d\n",sizeof(*&arr)); // 6,sizeof(&arr[1] + 1)); // 4,sizeof(char(*)[6]);	
	system("pause");
	return 0;
}

花括號定義不帶'\0',所以就只有sizeof().

3.(字串char的sizeof()和strlen)

char arr[] = "abcdef";
	printf("%d\n",sizeof(arr)); // 7,sizeof(char[7]);
	printf("%d\n",sizeof(arr[1])); // 1,sizeof(&arr)); // 4 sizeof(char(*)[7])
	printf("%d\n",sizeof(*&arr)); // 7 sizeof(char[7])
	printf("%d\n",sizeof(&*arr)); // 4 sizeof(char*)
	printf("%d\n",sizeof(&arr + 1)); // 4 sizeof(char(*)[7])

	printf("%d\n",strlen(arr)); // 6
	printf("%d\n",strlen(arr + 1)); // 5
	printf("%d\n",strlen(&arr + 1)); //型別不匹配
	printf("%d\n",strlen(&arr)); // 型別不匹配
	printf("%d\n",strlen(&arr[0])); // 6
	printf("%d\n",strlen(*&arr)); // 6
	printf("%d\n",strlen(&*arr)); // 6
	printf("%d\n",strlen(&arr[1] + 1));//4

strlen中型別不匹配是因為他們的資料型別不是char*.

4.(指標定義的sizeof()和strlen)

這個例題其實有點偏題了,涉及到指標和陣列的隱式轉化(感興趣的可以去看我的部落格–指標基礎總結詳解(裡面有指標和陣列的講解))

char* p = "abcdef";

	printf("%d\n",sizeof(p)); // 4 sizeof(char*)
	printf("%d\n",sizeof(p + 1)); // 4 sizeof(char*)
	printf("%d\n",sizeof(*p)); // 1 sizeof(char)
	printf("%d\n",sizeof(p[0])); // 1 sizeof(char)
	printf("%d\n",sizeof(&p)); // 4 sizeof(char**)
	printf("%d\n",sizeof(&p[1] + 1)); // 4 sizeof(char*)
	printf("%d\n",sizeof(*&p)); // 4 sizeof(char*)
	printf("%d\n",sizeof(&*p)); // 4 sizeof(char*)

	printf("%d\n",strlen(p)); // 6
	printf("%d\n",strlen(p + 1)); // 5
	printf("%d\n",strlen(*p)); // 型別不匹配
	printf("%d\n",strlen(p[1])); // 型別不匹配
	printf("%d\n",strlen(&p)); // 型別不匹配. 
	printf("%d\n",strlen(&p[1] + 1)); // 4
	printf("%d\n",strlen(*&p)); // 6
	printf("%d\n",strlen(&*p)); // 6


strlen中型別不匹配是因為他們的資料型別不是char*.

5.(花括號二維陣列int的sizeof())

int arr[3][4] = { 0 };
	printf("%d\n",sizeof(arr)); // 48 sizeof(int[3][4])
	printf("%d\n",sizeof(arr[0])); // 16 sizeof(int[4])
	// arr[0] int[4],再 + 1,就把 int[4] 轉成 int* 了
	printf("%d\n",sizeof(arr[0] + 1)); // 4 sizeof(int*)
	printf("%d\n",sizeof(&arr[0] + 1)); // 4 sizeof(int(*)[4])
	printf("%d\n",sizeof(arr[0][0])); // 4 sizeof(int)
	printf("%d\n",sizeof(*arr[0])); // 4,sizeof(int)
	// arr 是二維陣列 int[3][4] => int(*)[4] => * => int[4]
	 printf("%d\n",sizeof(*arr)); // 16 sizeof(int[4])
	// arr + 1 => int(*)[4] => * => int[4]
	printf("%d\n",sizeof(*(arr + 1))); // 16 sizeof(int[4])
	// arr => int[3][4] => int(*)[4] => * => int[4] => +1 => int*
	printf("%d\n",sizeof(*arr + 1));
	// 4 arr[0] => int[4] => & => int(*)[4] => +1 => int(*)[4]
	printf("%d\n",sizeof(&arr[0] + 1)); // 4 sizeof(int(*)[4])

	printf("%d\n",sizeof(*(arr[0] + 1)));
	// 4 arr[0] => int[4] => +1 => int* => * => int


到此這篇關於C語言中sizeof()與strlen()區別的文章就介紹到這了,更多相關C語言sizeof()與strlen()區別內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!