C 语言中的陷阱

函数中的内部变量会被回收

在 C 语言中,函数中的内部变量会在函数执行完成(调用出栈)之后被回收,因此不能将内部变量的指针赋值给函数外部的变量:

void foo(char *p) {
  p = "Hello, World!";
  // 错误,函数中的内部变量会在函数执行完成(调用出栈)之后被回收
}

? : 运算符优先级比 + - * / %

在 C 语言中,三目运算符 ? : 的优先级是很低的,比 + - * / % 运算符都要低,因此需要注意避免出现以下问题:

int i = 10 + ok ? 1 : -1;
// 该表达式的实际运算优先级是
// int i = (10 + ok) ? 1 : -1;

数组变量被当作指针处理

在 C 语言中,数组变量相当于该数组中第一个元素的地址,并且在调用函数过程中,被传递的数组变量实际上只是一个指针变量。因此例如 sizeof nums / sizeof nums[0] 之类的运算,应该在调用函数之前执行。

void foo(int *nums) {
  int len = sizeof nums / sizeof nums[0];
  // 错误,nums 只是一个指针变量
}

结构体之间的类型转换

// TODO

最后更新于