编程后端C开发者

C语言中的sizeof运算符如何工作,以及使用它时存在哪些陷阱?

用 Hintsage AI 助手通过面试

答案

操作符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)个字节,这导致了内存的不必要浪费以及依赖预期大小的代码中的问题。