sizeof、strlen、strlen和sizeof的區別
阿新 • • 發佈:2018-12-18
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
sizeof:6
請按任意鍵繼續. . .