在C语言中,sizeof
和 strlen
函数在处理字符串时有明显不同的作用和结果。
sizeof
- 定义:
sizeof
是一个编译时操作符,用于获取对象或类型在内存中占用的字节数。 - 字符串中的行为:当
sizeof
应用于字符串(实际上是字符数组)时,它返回的是整个数组所占用的字节数,包括字符串的结尾空字符'\0'
。但是,这个大小是在编译时就确定的,与字符串在运行时实际包含的字符数无关。
示例:
#include<stdio.h>
#include<string.h>
int main()
{
char cdata[] = "hello";
char *pdata = "hello";
char cdata2[128] = "hello";
printf("sizeof cdata: %d\n",sizeof(cdata));
printf("sizeof pdata: %d\n",sizeof(pdata));
printf("sizeof cdata2: %d\n",sizeof(cdata2));
return 0;
}
输出:
sizeof cdata: 6
sizeof pdata: 8
sizeof cdata2: 128
由此可见sizeof计算字符串长度时是包括,字符串结尾默认的 '\0 ' 的。同时在使用字符数组定义时,如果声明时给定了数组大小,而有效字符数不足时会默认补 '\0 ' 并计入字符串长度的。在使用指针定义时,由于pdata本身就是一个指针,而且C语言中用8个字节保存一个地址,所以其输出为8。
strlen
- 定义:
strlen
是一个函数,定义在<string.h>
头文件中,用于计算以'\0'
结尾的字符串的长度(不包括结尾的空字符'\0'
)。 - 字符串中的行为:
strlen
在运行时遍历字符串,直到遇到第一个'\0'
字符,然后返回它之前字符的数量。这意味着strlen
的返回值依赖于字符串在内存中的实际内容。
示例:
#include<stdio.h>
#include<string.h>
int main()
{
char cdata[] = "hello";
char *pdata = "hello";
char cdata2[128] = "hello";
printf("strlen cdata: %d\n",strlen(cdata));
printf("strlen pdata: %d\n",strlen(pdata));
printf("strlen cdata2: %d\n",strlen(cdata2));
return 0;
}
输出:
strlen cdata: 5
strlen pdata: 5
strlen cdata2: 5
从输出可以看出,在定义字符串数组时,无论是否声明数组长度,strlen函数都只会计算有效字符的长度,而且不包含 ' \0 '。
总结
- sizeof 在编译时确定对象或类型的大小,对于字符串(字符数组)来说,它返回的是整个数组的大小,包括未使用的空间和结尾的空字符。
- strlen 在运行时计算字符串的长度,即字符串中字符的数量(不包括结尾的空字符),它依赖于字符串的实际内容。
在处理字符串时,正确选择 sizeof
和 strlen
非常重要,因为它们的返回值和用途截然不同。