C语言——字符串中sizeof和strlen的辨析

在C语言中,sizeofstrlen 函数在处理字符串时有明显不同的作用和结果。

sizeof

  • 定义sizeof 是一个编译时操作符,用于获取对象或类型在内存中占用的字节数。
  • 字符串中的行为:当 sizeof 应用于字符串(实际上是字符数组)时,它返回的是整个数组所占用的字节数,包括字符串的结尾空字符 '\0'。但是,这个大小是在编译时就确定的,与字符串在运行时实际包含的字符数无关。
示例:
#include
#include

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 是一个函数,定义在  头文件中,用于计算以 '\0' 结尾的字符串的长度(不包括结尾的空字符 '\0')。
  • 字符串中的行为strlen 在运行时遍历字符串,直到遇到第一个 '\0' 字符,然后返回它之前字符的数量。这意味着 strlen 的返回值依赖于字符串在内存中的实际内容。
示例:
#include
#include

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 非常重要,因为它们的返回值和用途截然不同。

你可能感兴趣的:(C语言,c语言,算法,开发语言)