理解sizeof的本质sizeof是 C/C 中的关键字用于在编译时计算数据类型或变量占用的字节数。其行为与函数不同不会对括号内的表达式求值仅分析类型信息。验证示例int a 10; size_t size sizeof(a); // a 不会执行 printf(Size: %zu, a: %d\n, size, a); // 输出 Size: 4, a: 10常见使用场景基本类型与变量sizeof(int); // 4假设 int 为 4 字节 char c; sizeof(c); // 1数组计算整个数组的字节大小int arr[5]; sizeof(arr); // 5 * sizeof(int) 20陷阱数组作为函数参数时退化为指针void func(int arr[]) { sizeof(arr); // 输出指针大小如 8 字节 }结构体与内存对齐结构体大小受对齐规则影响struct Example { char a; // 1 字节 int b; // 4 字节 }; sizeof(struct Example); // 可能为 8补齐 3 字节指针相关行为int* ptr; sizeof(ptr); // 指针大小通常 4 或 8 字节 sizeof(*ptr); // sizeof(int) 4数组指针辨析int arr[3][4]; sizeof(arr[0]); // 164 * sizeof(int) sizeof(arr[0] 1); // 8指针运算后仍为指针面试题解析题目以下代码的输出是什么int a[] {1, 2, (3, 4)}; // 逗号表达式结果为 4 printf(%zu\n, sizeof(a)); // 123 * 4 printf(%zu\n, sizeof(a)); // 8指针大小 printf(%zu\n, sizeof(*a)); // 4a[0] 是 int关键点逗号表达式(3, 4)的值为最后一个操作数4。a是数组地址类型为int(*)[3]但sizeof仅关心指针大小。避坑总结编译时行为sizeof在编译期确定结果不执行表达式。数组退化函数参数中数组会退化为指针导致sizeof结果变化。内存对齐结构体的sizeof可能大于成员总和。通过理解这些规则可避免嵌入式开发中因sizeof误用导致的内存计算错误。
21. 嵌入式面试避坑指南:sizeof 是关键字,不是函数!
理解sizeof的本质sizeof是 C/C 中的关键字用于在编译时计算数据类型或变量占用的字节数。其行为与函数不同不会对括号内的表达式求值仅分析类型信息。验证示例int a 10; size_t size sizeof(a); // a 不会执行 printf(Size: %zu, a: %d\n, size, a); // 输出 Size: 4, a: 10常见使用场景基本类型与变量sizeof(int); // 4假设 int 为 4 字节 char c; sizeof(c); // 1数组计算整个数组的字节大小int arr[5]; sizeof(arr); // 5 * sizeof(int) 20陷阱数组作为函数参数时退化为指针void func(int arr[]) { sizeof(arr); // 输出指针大小如 8 字节 }结构体与内存对齐结构体大小受对齐规则影响struct Example { char a; // 1 字节 int b; // 4 字节 }; sizeof(struct Example); // 可能为 8补齐 3 字节指针相关行为int* ptr; sizeof(ptr); // 指针大小通常 4 或 8 字节 sizeof(*ptr); // sizeof(int) 4数组指针辨析int arr[3][4]; sizeof(arr[0]); // 164 * sizeof(int) sizeof(arr[0] 1); // 8指针运算后仍为指针面试题解析题目以下代码的输出是什么int a[] {1, 2, (3, 4)}; // 逗号表达式结果为 4 printf(%zu\n, sizeof(a)); // 123 * 4 printf(%zu\n, sizeof(a)); // 8指针大小 printf(%zu\n, sizeof(*a)); // 4a[0] 是 int关键点逗号表达式(3, 4)的值为最后一个操作数4。a是数组地址类型为int(*)[3]但sizeof仅关心指针大小。避坑总结编译时行为sizeof在编译期确定结果不执行表达式。数组退化函数参数中数组会退化为指针导致sizeof结果变化。内存对齐结构体的sizeof可能大于成员总和。通过理解这些规则可避免嵌入式开发中因sizeof误用导致的内存计算错误。