C++
size_t strlen(const char *str) {
size_t length = 0;
while (*str++)
++length;
return length;
}
举例:
C++
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char arr[10] = "hello";
cout << strlen(arr) << endl; // 5
cout << sizeof(arr) << endl; // 10
return 0;
}
若字符数组 arr 作为函数的形参,sizeof(arr) 中 arr 被当作字符指针来处理,strlen(arr) 中 arr 依然是字符数组,从下述程序的运行结果中就可以看出。
C++
#include <iostream>
#include <cstring>
using namespace std;
void size_of(char arr[])
{
cout << sizeof(arr) << endl; // warning: 'sizeof' on array function parameter 'arr' will return size of 'char*' .
cout << strlen(arr) << endl;
}
int main()
{
char arr[20] = "hello";
size_of(arr);
return 0;
}
/*
输出结果:
8
5
*/
strlen 本身是库函数,因此在程序运行过程中,计算长度;而 sizeof 是在编译时计算长度;sizeof 的参数可以是类型,也可以是变量,且必须是完整类型;strlen 的参数必须是 char * 类型的变量。
sizeof 接受的参数可以是对象也可以是表达式,但是 sizeof(expression) 在运行时不会对接受的表达式进行计算,编译器只会推导表达式的类型从而计算占用的字节大小;而 strlen 是一个函数,如果接受表达式则会对表达式进行运算。
C++
#include <iostream>
using namespace std;
int main(int argc, char * argv[])
{
int x = 4;
char *s = "12345678";
char *p = s;
sizeof(x++);
printf("%d\n", x);
strlen(p++);
return 0;
}
对于 C99 中结构体允许最后一个变量为不定长数组,sizeof 则不计算空间。
C++
#include <iostream>
#include <cstring>
using namespace std;
struct flexarray {
int val;
int array[]; /* Flexible array member; must be last element of struct */
};
int main()
{
printf("%ld\n", sizeof(struct flexarray)); // 4
}
阅读量:2013
点赞量:0
收藏量:0