目录
1.sizeof
1.1本质
sizeof是C/C++中的关键字,属于编译时运算符 ,用于计算数据类型或变量占用内存的字节数。
1.2使用形式
cs
- sizeof(类型名) :如 sizeof(int) (结果通常为4)。
- sizeof(变量名) :如 int a; sizeof(a) (结果为变量 a 的字节数)。
1.3特点
- 结果与数据类型、平台(32位/64位)相关,例如:
- char :1字节; int :通常4字节(64位系统同32位); double :8字节。
- 数组: sizeof(数组名) 返回整个数组的字节数。
- 不实际计算表达式的值,仅计算类型大小,例如:
sizeof(1+2*3) 结果为 sizeof(int) ,因表达式结果为 int 类型。
1.4实例
1. 4.1 计算基础数据类型大小
cs
#include <stdio.h>
int main() {
printf("char: %zu 字节\n", sizeof(char)); // 输出:1
printf("int: %zu 字节\n", sizeof(int)); // 输出:4(32/64位系统常见值)
printf("double: %zu 字节\n", sizeof(double)); // 输出:8
return 0;
}
1.4.2 计算变量占用内存大小
cs
#include <stdio.h>
int main() {
int num = 100;
char ch = 'A';
printf("num 占用 %zu 字节\n", sizeof(num)); // 输出:4(int类型大小)
printf("ch 占用 %zu 字节\n", sizeof(ch)); // 输出:1(char类型大小)
return 0;
}
1.4.3 计算数组总大小
cs
#include <stdio.h>
int main() {
int arr[] = {1, 2, 3, 4, 5}; // 数组长度为5
printf("数组总大小:%zu 字节\n", sizeof(arr)); // 输出:20(5×4字节)
return 0;
}
1.4.4 计算表达式类型大小(不执行运算)
cs
#include <stdio.h>
int main() {
int a = 1, b = 2;
// 仅计算表达式结果的类型(int)大小,不计算1+2的值
printf("表达式类型大小:%zu 字节\n", sizeof(a + b)); // 输出:4
return 0;
}
2.strlen
2.1本质
C标准库函数,声明在 <string.h> 头文件中,用于计算字符串的实际长度(不包含末尾的 \0 空字
符)。
2.2使用形式
cs
size_t strlen(const char *str) ,参数为指向字符串的指针(以 \0 结尾)。
2.3特点
- 运行时计算,从字符串首地址开始逐个字符遍历,直到遇到 \0 停止。
- 示例:
cs
char arr[] = "abc"; // 实际存储为 'a','b','c','\0'
printf("%zu", strlen(arr)); // 输出3(不包含'\0')
-
注意:
-
若字符串未正确以 \0 结尾, strlen 会越界访问内存,导致未定义行为。
-
不能用于计算数组(非字符串)的长度,例如 int arr[5] 无法用 strlen 获取元素个数。
2.4实例
2.4.1 计算普通字符串长度
cs
#include <stdio.h>
#include <string.h> // 需包含头文件
int main() {
char str[] = "hello world"; // 实际存储:'h','e','l','l','o',' ','w','o','r','l','d','\0'
size_t len = strlen(str); // 计算到'\0'前的字符数
printf("字符串长度:%zu\n", len); // 输出:11(不含'\0')
return 0;
}
2.4.2 空字符串与字符数组的区别
cs
#include <stdio.h>
#include <string.h>
int main() {
char empty_str[] = ""; // 空字符串,仅含'\0'
char arr[] = {'a', 'b'}; // 字符数组(无'\0'结尾)
printf("空字符串长度:%zu\n", strlen(empty_str)); // 输出:0(仅'\0',无有效字符)
// 警告:arr无'\0',strlen会越界访问,结果未定义
printf("字符数组长度:%zu\n", strlen(arr)); // 可能输出随机值(危险!)
return 0;
}
2.4.3 指针与数组的区别
cs
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "abc"; // 数组,sizeof(str)为4(含'\0')
char *ptr = str; // 指针,sizeof(ptr)为8(64位系统指针大小)
printf("数组长度(sizeof):%zu\n", sizeof(str)); // 输出:4
printf("字符串长度(strlen):%zu\n", strlen(str)); // 输出:3
printf("指针大小(sizeof):%zu\n", sizeof(ptr)); // 输出:8(指针占8字节)
return 0;
}
3.sizeof和strlen的对比

3.1 对比实例
cs
#include <stdio.h>
#include <string.h>
int main() {
char arr[10] = "abcd"; // 数组大小10,存储"abcd\0...."(后5字节为随机值)
printf("sizeof(arr): %zu\n", sizeof(arr)); // 输出:10(数组总字节数)
printf("strlen(arr): %zu\n", strlen(arr)); // 输出:4(遇'\0'停止)
return 0;
}
-
sizeof(arr) 关注数组声明的大小(10字节)。
-
strlen(arr) 关注有效字符数(4个,不含 \0 )。
希望本篇内容能够帮助大家对sizeof和strlen的理解,感谢大家的观看!