操作符sizeof用于在编译时确定类型或对象的大小(以字节为单位)。它通常用于分配内存、计算结构体和数组的大小。
示例:
int a; printf("%zu\n", sizeof(a)); // 变量a的类型int的大小 printf("%zu\n", sizeof(int)); // 类型int的大小
特性:
sizeof返回size_t,总是>= 0。sizeof(array)返回整个数组的大小,而不是指针的大小。陷阱示例:
void foo(int arr[]) { printf("%zu\n", sizeof(arr)); // 输出指针的大小,而不是数组的大小! } int arr[10]; foo(arr); // sizeof(arr) == 40(通常),sizeof(arr在foo中)== 8(通常)
在C语言中,表达式sizeof('a')会返回什么?
答案: 尽管'a'看起来像char,但在表达式sizeof('a')中,结果等于int类型的大小,因为字符常量在C中是int。
示例:
sizeof('a') // 通常是4,而不是1
故事
malloc(strlen(str) * sizeof(char)),忘记了空字符。这导致丢失了最后一个字节,并在处理标准库字符串处理函数时出现了错误。故事
sizeof(arr),期待获得整个结构的大小,但只收到了指针的大小。结果导致写入内存的数据太少,导致堆内存损坏。故事
开发者决定使用sizeof('a')来为一个字母分配内存,期待1个字节,却得到了4(或8)个字节,这导致了内存的不必要浪费以及依赖预期大小的代码中的问题。