1.0 sizeof介绍
sizeof是一个关键字, sizeof(x): 编译器给我们查看内存空间容量的⼀个⼯具,在编译时计算并确定出x在内存中所占字节数。
- sizeof 返回 size_t 类型,这是一个定义在 <stddef.h>(C)或
(C++)中的无符号整数类型。 - 输出时应使用 %zu(C/C++)或 std::cout(C++),避免类型不匹配警告。
1.1 sizeof的语法形式
- 对类型:sizeof(type),必须加括号(如 sizeof(int))。
- 对变量:sizeof variable 或 sizeof(variable),括号可选(但建议统一使用括号)。
1.2 sizeof的常见使用
- 基本类型
sizeof(int); // 通常 4(32/64位系统)
sizeof(char); // 1(始终为 1 字节)
sizeof(double); // 通常 8
- 指针
int* p;
sizeof(p); // 指针大小(32位系统为4,64位系统为8)
sizeof(*p); // 指向的数据类型大小(int,通常4)
- 数组
int arr[10];
sizeof(arr); // 返回整个数组的大小(10 * sizeof(int))
// 数组名在 sizeof 中不退化为指针!// 计算数组元素个数:
size_t count = sizeof(arr) / sizeof(arr[0]); // 10
- 结构体和类
struct S {char c; // 1 字节int i; // 4 字节// 可能包含 3 字节填充(对齐到4)
};
sizeof(S); // 可能为 8(因内存对齐)
1.3 sizeof的常见误解
- 误解:sizeof 返回动态分配内存的大小
int* p = malloc(10 * sizeof(int));
sizeof(p); // 返回指针大小(如8),而非分配的内存大小!
- 误解:sizeof 计算字符串长度
const char* s = "hello";
sizeof(s); // 指针大小(如8)
sizeof("hello"); // 6(包含 '\0' 的字符数组大小)
strlen("hello"); // 5(不包含 '\0')
- 误解:sizeof 对表达式求值
int a = 0;
sizeof(a++); // 等价于 sizeof(int),a 仍为0!
- 误解:结构体大小等于成员总和
struct Packed { // 可能占用 5 字节(无填充)char c;int i;
} __attribute__((packed)); // GCC 特性,取消填充
- 误解:C 和 C++ 中 sizeof('a') 相同
// C 中 'a' 是 int 类型,sizeof('a') 返回4;
// C++ 中 'a' 是 char 类型,返回1。
- 误解:sizeof 的返回值是 int
// 错误用法:
printf("%d\n", sizeof(int)); // 可能警告(格式不匹配)
// 正确用法:
printf("%zu\n", sizeof(int)); // C99/C++11 支持
2.0 指针大小
在 C/C++ 中,指针的大小取决于系统的架构和编译环境,而不是指针指向的数据类型。
- 指针大小的通用规则
- 32 位系统:指针大小为 4 字节(32 位地址空间)。
- 64 位系统:指针大小为 8 字节(64 位地址空间)。
无论指针类型是 int*、char* 还是其他类型,它们的 sizeof 结果一致(但函数指针可能有例外,见下文)。
- 验证 sizeof 的结果
#include <iostream>int main() {std::cout << "sizeof(int*) = " << sizeof(int*) << std::endl; // 例如:8(64位系统)std::cout << "sizeof(char*) = " << sizeof(char*) << std::endl; // 同上std::cout << "sizeof(void*) = " << sizeof(void*) << std::endl; // 同上std::cout << "sizeof(double*) = " << sizeof(double*) << std::endl; // 同上return 0;
}
参考
- 【嵌入式C语言高阶版】 https://www.bilibili.com/video/BV1qCSkY7EyD/?p=15&share_source=copy_web&vd_source=e918d05c855265d9b6476ab860322e91
- 【嵌入式八股文面试题合集-嵌入式工程师笔试面试100题 校招社招必备 嵌入式开发/Linux/STM32单片机/C语言/C++/Qt/秋招春招/FreeRTOS】 https://www.bilibili.com/video/BV17n6PY7EYB/?p=2&share_source=copy_web&vd_source=e918d05c855265d9b6476ab860322e91