C strlen() 和sizeof()

strlen() 是一个函数,求字符串的长度,但是不包括结束符 ‘\0’;
size_t strlen(char const *str);
sizeof()是一个单目运算符,求的是字符串的大小,包括结束符’\0’; 其参数可以是指针,数组,类型,对象和函数。
下面总结一下,不同情况下strlen()和sizeof()的结果:
情况1:
int main()
{
char *str = “Hello”;
cout << strlen(str) << endl; // 5
cout << sizeof(str) << endl; // 6 包括 \0
return 0;
}
这是最简单的一种情况,字符串str的长度是5,大小是6个字节(包括 ‘\0’)。
情况2:
int main()
{
char str[10] = “Hello”;
cout << strlen(str) << endl; // 5
cout << sizeof(str) << endl; // 10
return 0;
}
字符串的长度不用解释,大小是10个字节,这是因为数组的空间已经被定义为10,所以空间最大为10,即字符串的长度最大为9,若超出则程序出错,说明超出界限溢出。
情况3:
int main()
{
char str[] = {‘H’, ‘e’, ‘l’, ‘l’, ‘o’};
cout << strlen(str) << endl; // 不确定, 随机的
cout << sizeof(str) << endl; // 5
return 0;
}
此种情况,长度不确定,随机的,因为数组的没有初始化,不确定\0的位置。可能在str[6],也可能在之后的任意位置。大小就是数组内的5个字符,即大小为5个字节。
情况4:
int main()
{
char str[10] = { ‘H’, ‘e’, ‘l’, ‘l’, ‘o’ };
cout << strlen(str) << endl; // 5
cout << sizeof(str) << endl; // 10
return 0;
}
和情况2相同,数组的10个空间的数组没有填充满,则用0填充。\0 在数学意义上数字0 \ 是转义字符。大小同情况2。
情况4:
int main()
{
char str[10];
for (int i = 0; i < 5; ++i)
{
str[i] = ‘a’ + i; // a b c d e
}
cout << strlen(str) << endl; // 随机
cout << sizeof(str) << endl; // 10
return 0;
}
此种情况是因为数组str[]是一个局部变量,说明初始化填充的不是0, 是随机数。所以\0的位置也不能够确定,即长度是随机的。 大小同情况2.
情况5:
char str[10];
int main()
{
for (int i = 0; i < 5; ++i)
{
str[i] = ‘a’ + i; // a b c d e
}
cout << strlen(str) << endl; // 5
cout << sizeof(str) << endl; // 10
return 0;
}
数组被定为全局变量,已经初始化值是0,而不是随机的。所以当走完 ‘a’,‘b’,‘c’,‘d’,'e’五个字符后,就碰到0,即结束符。所以长度为5.大小同情况2.
情况6:
int main()
{
static char str[10];
for (int i = 0; i < 5; ++i)
{
str[i] = ‘a’ + i; // a b c d e
}
cout << strlen(str) << endl; // 5
cout << sizeof(str) << endl; // 10
return 0;
}
数组被定义为静态变量,初始化填充的是0。同情况5,大小同情况2.
情况7:
void fun(char str[])
{
cout << strlen(str) << endl; // 5
cout << sizeof(str) << endl; // 4 传递是数组,退化为指针。
}
int main()
{
char str[] = “Hello”;
cout << strlen(str) << endl; // 5
cout << sizeof(str) << endl; // 6 包括 \0
fun(str);
return 0;
}
main()函数中的不解释,同情况1,调动fun()函数,参数列表是一个数组,退化后相当于一个指针。而在32位的机器中,指针大小是4个字节, 64位时是8个字节。
情况8:
short *ar[10][10];
int main()
{
cout << sizeof(*ar) << endl; //400
return 0;
}
不管什么类型的指针, 32位都是4个字节,再加上数组是一个二维数组,开辟了100个空间,所以大小为400个字节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值