对 return C 中的指针时的安全问题感到困惑

Confused about the safety issue when return a pointer in C

我知道C是按值传递的。所以我认为每次调用函数时 a 和 b 的地址可能不同,但我不确定....我说得对吗?

举个例子:

int *x = i(1, 0);

printf("%d\n", *x);

这会调用未定义的行为,因为函数参数具有自动存储持续时间,并且在函数 returns.

时被丢弃

在函数 i 内,ab 对象是函数的局部对象,它们的生命周期在函数 returns.

时结束

是的,它们可能不同。尝试做一些实验。

#include <stdio.h>

int *i(int a, int b) {
  if (a > b)
    return &a;
  else return &b;
}

void test(void) {
  printf("%p\n", (void*)i(1, 0));
}

int main(void) {
  printf("%p\n", (void*)i(1, 0));
  test();
  return 0;
}

注意:不要取消引用返回的指针,因为它们指向的内容在从函数返回时已经消失。