在C中返回指针时对安全问题感到困惑

时间:2015-12-07 23:19:54

标签: c pointers parameter-passing memory-address

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

enter image description here

2 个答案:

答案 0 :(得分:2)

让我们举个例子:

int *x = i(1, 0);

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

这会调用未定义的行为,因为函数参数具有自动存储持续时间,并在函数返回时被丢弃。

在函数i内,ab对象是函数的本地对象,它们的生命周期在函数返回时结束。

答案 1 :(得分:2)

是的,他们可能会有所不同。尝试做一些实验。

#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;
}

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