1. 程式人生 > >sizeof、strlen、strlen和sizeof的區別

sizeof、strlen、strlen和sizeof的區別

sizeof( )是運算子

功能:獲得型別或表示式的最大物件的位元組大小。

sizeof()可以計算陣列、指標、型別、物件、函式

陣列——編譯時分配的陣列空間大小;
指標——儲存該指標所用的空間大小(儲存該指標的地址的長度,是長整型,32位作業系統應該為4);
型別——該型別所佔的空間大小;
物件——物件的實際佔用空間大小;
函式——函式的返回型別所佔的空間大小。函式的返回型別不能是void。
#include <iostream>

int main()
{
	int a = 1;
	int b[10]
= { 0 }; int* pa = &a; int* pb = b; std::cout << "int型別的a:"<<sizeof(a) << std::endl; std::cout << "int型別的陣列b:"<<sizeof(b) << std::endl; std::cout <<"整型指標pa:"<< sizeof(pa) << std::endl; std::cout << "char:"<<sizeof(char
) << std::endl; std::cout << "float:" << sizeof(float) << std::endl; std::cout << "double:" << sizeof(double) << std::endl; std::cout << "short:" << sizeof(short) << std::endl; std::cout << "int:" << sizeof(int) << std:
:endl; std::cout << "long:" << sizeof(long) << std::endl; std::cout << "main():" << sizeof(main()) << std::endl; system("pause"); return 0; }

在這裡插入圖片描述

strlen()是函式

功能:strlen 測量的是字元的實際長度,以’\0’ 結束,不包括’\0’在內,引數必須是char*,strlen所作的僅僅是一個計數器的工作。

#include <iostream>

int main()
{
	char b[10] = { 1 };

	std::cout << strlen(b) << std::endl;

	system("pause");
	return 0;
}

在這裡插入圖片描述

strlen()和sizeof()的區別

1. strlen 是函式,sizeof 是運算子。

2. strlen 測量的是字元的實際長度,以’\0’ 結束。而sizeof 測量的是字元的分配大小。

比如:

char str[20] = "hello";
 
printf("strlen: %d\n", strlen(str));
printf("sizeof: %d\n", sizeof(str));

結果是:

[[email protected] 0703]# ./hello 
strlen: 5
sizeof: 20

3、但是在子函式中,sizeof 會把從主函式中傳進來的字元陣列當作是指標來處理。指標的大小又是由機器來決定,而不是人為的來決定的。

#include <iostream>

void size_of(char str[])
{
	printf("sizeof:%d\n", sizeof(str));
}

int main()
{
	char str[20] = "hello";

	size_of(str);

	system("pause");
	return 0;
}

在這裡插入圖片描述

4、strlen()函式是一個計數器的作用,遇到’\0’結束,當初始的陣列沒有’\0’,結果不可預料。

#include<iostream>
int main()
{
	char str1[] = "hello";
	char str2[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
	char str3[] = { 'h', 'e', 'l', 'l', 'o' };

	printf("str1:%s\n", str1);
	printf("str2:%s\n", str2);
	printf("str3:%s\n", str3);
	printf("str1:%d\n", strlen(str1));
	printf("str2:%d\n", strlen(str2));
	printf("str3:%d\n", strlen(str3));

	system("pause");
	return 0;
}

在這裡插入圖片描述

str3初始化沒有’\0’,這個程式越界訪問,只是編譯器沒有報錯。

5、sizeof可以用型別做引數,strlen只能用char*做引數,且必須是以’’\0’'結尾的。

6、sizeof()計算的是作業系統給該引數開闢的記憶體空間的大小,在char*型別中包括’\0’,strlen()計算的是實際所佔的字元長度,不包括’\0’或者NULL。

例如:

#include<iostream>
int main()
{
	char str[] = "hello";

	std::cout << "strlen:"<<strlen(str) << std::endl;
	std::cout << "sizeof:"<<sizeof(str) << std::endl;

	system("pause");
	return 0;
}

結果為:

strlen:5
sizeof6
請按任意鍵繼續. . .