一、示例说明区别
1.1 针对char*
strlen和sizeof的区别用以下示例说明:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
char *ptr = str;
// 使用sizeof计算ptr的大小(注意这里的陷阱)
printf("Size of ptr (pointer size): %zu\n", sizeof(ptr));
// 使用strlen计算ptr指向的字符串的长度
printf("Length of string pointed by ptr: %zu\n", strlen(ptr));
return 0;
}
函数输出结果
Size of ptr (pointer size): 4 或 8
Length of string pointed by ptr: 13
这里的4
或8
取决于系统指针的大小。在32位系统上,指针通常是4个字节;在64位系统上,指针通常是8个字节。
解释
-
sizeof(ptr): 这里
ptr
是一个指针变量,sizeof
计算的是指针变量本身所占的内存字节数,而不是指针所指向的内存区域的大小。因此,它返回的是指针在特定平台上的大小(通常是4或8个字节)。 -
strlen(ptr): 这里
ptr
被当作一个指向字符数组(字符串)首元素的指针。strlen
函数遍历这个字符串,直到遇到\0
字符为止,并返回遇到的\0
之前的字符数。因此,对于指向"Hello, World!"
的指针,strlen
返回的结果是13。
注意事项
- 使用
sizeof
与指针时,要特别注意它返回的是指针本身的大小,而不是指针所指向的内存区域的大小。 - 使用
strlen
时,必须确保传递给它的指针确实指向了一个以\0
结尾的字符串。如果指针没有指向有效的字符串或指向的内存区域不包含\0
,那么strlen
的行为将是未定义的,可能会导致程序崩溃或返回错误的结果。 - 在处理动态分配的字符串(如使用
malloc
或calloc
分配的内存)时,sizeof
无法用来获取字符串的长度,因为sizeof
只能用于计算静态分配的对象或类型的大小。对于动态分配的字符串,你应该使用strlen
来获取长度,或者使用额外的变量来跟踪字符串的长度。
1.2 针对char数组
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
// 使用sizeof计算str所占的内存字节数
printf("Size of str (in bytes): %zu\n", sizeof(str));
// 使用strlen计算str的长度(不包括'\0')
printf("Length of str (excluding '\\0'): %zu\n", strlen(str));
return 0;
}
函数输出结果
注意:实际上,由于字符串"Hello, World!"
以\0
结尾,它在内存中占用的空间是14个字节(包括13个字符和1个结尾的\0
)。但是,strlen
函数只计算到\0
之前的字符数,因此返回13。而sizeof
操作符计算的是整个数组(包括结尾的\0
)所占的字节数,因此返回14。
解释
-
sizeof(str): 这里
str
是一个字符数组,sizeof
操作符计算的是整个数组所占的内存字节数,包括数组中所有字符和结尾的\0
。在大多数情况下,字符(char
)在内存中占用1个字节,但sizeof
计算的是整个数组所占的空间,即12个字符 + 1个\0 = 13个字节
。 -
strlen(str): 这里
str
被当作一个指向字符数组首元素的指针传递给strlen
函数。strlen
函数遍历这个字符串,直到遇到\0
字符为止,并返回遇到的\0
之前的字符数。因此,对于字符串"Hello, World!"
,strlen
返回的结果是12。
通过这个案例,我们可以清晰地看到sizeof
和strlen
在使用上的区别:sizeof
用于获取对象或类型在内存中的大小(以字节为单位),而strlen
用于获取以\0
结尾的字符串的长度(以字符为单位,不包括\0
)。
二、sizeof
定义:sizeof
是C语言(以及C++)中的一个操作符,用于在编译时计算对象或类型所占的内存字节数。
用法:
- 可以用于基本数据类型(如
int
、float
、char
等),此时它返回该类型对象所占的字节数。 - 可以用于数组,此时它返回整个数组所占的内存字节数,而不是数组的长度(即元素个数)。
- 可以用于结构体和联合体,此时它返回结构体或联合体所占的内存字节数。
- 可以用于指针,此时它返回指针本身所占的字节数,而不是指针所指向的内存区域的大小。
- 也可以用于类型(使用括号括起来),如
sizeof(int)
。
返回值:sizeof
的返回值是一个无符号整数(size_t
),表示所计算对象或类型所占的内存字节数。
三、strlen
定义:strlen
是C语言(以及C++)中的一个标准库函数,用于计算以'\0'结尾的字符串的长度(不包括结尾的'\0')。
用法:
strlen
的参数是一个指向字符的指针,通常是一个字符数组(字符串)的首地址。- 它遍历字符串,直到遇到第一个'\0'字符,然后返回遇到的'\0'之前的字符数。
返回值:strlen
的返回值也是一个无符号整数(size_t
),表示字符串中字符的数量(不包括结尾的'\0')。