| 上一篇 | 下一篇 |
|---|---|
| C++ 中指针和引用的区别 |
C/C++ 中 sizeof 和 strlen 的区别
本质不同:
sizeof:是一个编译时运算符 ,用于获取 变量或类型所占的字节数 (包括\0)。
strlen:是一个函数 (定义在<string.h>或<cstring>中),用于计算 字符串的实际长度 (不包括结尾的空字符\0)。
具体对比:
| 对比项 | sizeof | strlen |
|---|---|---|
| 类型 | 编译时运算符 | 函数 |
| 参数要求 | 任何变量或类型 | 指向以 \0 结尾的连续字符序列的指针(char 数组或 char 指针) |
| 返回值 | 变量在内存中占用的总字节数(包含 /0 ) |
返回字符串中有效字符的个数(不包含 /0 ) |
| 返回值类型 | size_t |
size_t |
| 计算时机 | 在编译时确定(除了 C99 的变长数组) | 在运行时计算 |
注意:
- 使用
strlen时,需要包含<string.h>或<cstring>头文件。 - 关于
strlen的输入参数虽然一般都说是字符串,但本质上是指向以\0结尾的连续字符序列的指针。strlen函数的运作方式是:从这个指针开始,往后逐个读取字符,直到遇到第一个\0为止,返回中间经过的非空字符个数。- 字符串字面量在内存中的存储方式是字符数组,作为参数传入时,其实传入的是字符数组的首地址。
strlen不能用于未以\0结尾的字符数组(否则会越界读取,导致崩溃或错误结果)。sizeof作用于数组时能返回整个数组大小,但一旦数组作为参数传入函数,就会退化为指针,此时sizeof只返回指针大小。
示例:
c
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello"; // 实际存储为 {'H','e','l','l','o','\0'}
char *p = "Hello";
printf("strlen(str) = %zu\n", strlen(str)); // 输出:5
printf("sizeof(str) = %zu\n", sizeof(str)); // 输出:6(5个字符 + 1个\0)
printf("strlen(p) = %zu\n", strlen(p)); // 输出:5
printf("sizeof(p) = %zu\n", sizeof(p)); // 输出:8(在64位系统上,指针大小为8字节)
return 0;
}
运行结果:
5
6
5
8