`sizeof`和`strlen`在C语言中都是常用的函数/运算符,但它们的用途和工作方式不同。让我们详细了解一下它们的区别。
1. sizeof
`sizeof`是一个**运算符**,用于计算变量或数据类型的**大小**(以字节为单位)。它在**编译时**就已经计算出结果。
用法
- `sizeof`可以用来计算任何数据类型的大小(例如`int`、`char`、`float`等),也可以用来计算数组、结构体、指针等复杂类型的大小。
示例
c
#include <stdio.h>
int main() {
int a = 10;
char str[20] = "hello";
printf("int 类型的大小: %zu bytes\n", sizeof(a)); // 输出 int 类型的大小
printf("char[20] 数组的大小: %zu bytes\n", sizeof(str)); // 输出 char 数组的大小
printf("指针的大小: %zu bytes\n", sizeof(char*)); // 输出指针类型的大小
return 0;
}
输出
```
int 类型的大小: 4 bytes
char[20] 数组的大小: 20 bytes
指针的大小: 8 bytes (假设运行在64位系统上)
```
特点
- `sizeof`在计算数组大小时,会返回整个数组的大小(即:元素个数乘以单个元素的大小)。
- `sizeof`在计算指针时,返回的是指针本身的大小(例如在64位系统上通常是8字节)。
- `sizeof`对字符串字面量的计算会包括末尾的空字符 `'\0'`。
2. strlen
`strlen`是一个**函数**,用于计算以**`'\0'` 结尾的字符串**的**长度**(不包括字符串的终止字符 `'\0'`)。它在**运行时**计算字符串的长度。
用法
- `strlen`用于计算字符串的实际字符数,不包括`'\0'`。
示例
c
#include <stdio.h>
#include <string.h>
int main() {
char str[20] = "hello";
printf("字符串的长度: %zu\n", strlen(str)); // 输出字符串的长度,不包括末尾的 '\0'
return 0;
}
输出:
字符串的长度: 5
特点
- `strlen`只适用于字符串(字符数组),它只能计算**以 `'\0'` 结尾的字符串**长度。
- `strlen`不包括末尾的空字符 `'\0'`。
- `strlen`的参数必须是一个字符指针或字符数组,而不能是一个非字符串类型的数组。
3.sizeof 和 strlen 区别
示例比较1
printf("%d",sizeof("hello"));
printf("%d", strlen("hello"));
输出结果:
65
因为strlen计算长度时不包括 \0 (字符串结束符);
比较2
#include <stdio.h>
#include <string.h>
int main() {
char str[20] = "hello";
printf("sizeof(str): %zu\n", sizeof(str)); // 输出数组的总大小: 20
printf("strlen(str): %zu\n", strlen(str)); // 输出字符串的长度: 5
char *ptr = "world";
printf("sizeof(ptr): %zu\n", sizeof(ptr)); // 输出指针的大小: 8 (在64位系统上)
printf("strlen(ptr): %zu\n", strlen(ptr)); // 输出字符串的长度: 5
return 0;
}
sizeof(str): 20 // `str` 是一个20字节的字符数组,`sizeof`返回整个数组的大小。
strlen(str): 5 // `str` 中的字符串 "hello" 长度为 5,`strlen` 返回字符数。
sizeof(ptr): 8 // `ptr` 是一个指针(在64位系统上通常是8字节)。
strlen(ptr): 5 // `ptr` 指向字符串 "world",长度为5。
```
总结
- sizeof用于获取数据类型或变量的内存大小。
- strlen 用于获取字符串的**实际长度**(不包括终止符 `'\0'`)。
- 使用`sizeof`时要注意它返回的是**数组总大小**,而`strlen`返回的是**字符串的长度**。
- 在字符串操作中,`strlen`是更常用的,因为它计算的是字符串的有效字符数,而不是整个数组的大小。