这个静态变量赋值给局部函数中的指针有什么问题

What is the issue with this static variable assignment to a pointer in local function?

本文关键字:指针 问题 什么 函数 局部 静态 变量 赋值      更新时间:2023-10-16
int* func(int *ptr)
{
  static int a = 5;
  ptr = &a;
  return ptr;
}

有人在采访中问过我这个问题。现在的重点是,变量"a"是静态的,因此,与声明的普通变量不同,一旦函数返回,它就会失去它的值(从堆栈中弹出(,这个变量保留它的值,因为它是一个静态的。

然后我不明白,这段代码有什么问题?

ptr作为参数是没有意义的。不使用传递的值。您可以将其更改为

int* func()
{
  static int a = 5;
  return &a;
}

没有问题。 a是静态的,因此它在执行的整个生命周期中都存在。它在语法上不可见func。您只是返回一些"隐藏"全局变量的地址。

传入的ptr的值(您指向的地址(不会在函数外部更改,因为您正在更改本地范围的ptr副本

它需要通过引用或指针到指针传入才能更改。

int* func(int **ptr)
{
  static int a = 5;
  *ptr = &a;
  return *ptr;
}

我正在提请您注意局部静态变量。从上次调用开始,变量将始终保持不变。因此,如果您增加变量a=a+1则下次该值保持为 6。事情是怎么回事。每个本地在每次调用中声明内存中的新空间。但是在静态变量中,您告诉每次都使用相同的内存。因此,指针将保持不变。这就是为什么你会得到相同的地址。这并不出乎意料。

没有问题,除非调用方不了解函数的作用。这是很有可能的,因为人们可能会假设函数修改了参数指向的值。

例如,如果有人编写这样的代码

int foo = 0;
func(&foo);
assert(foo == 5);

他们会有问题。

面试官可能一直在寻找这样的解决方案:

int *func(int *ptr) {
    static int a = 5;
    *ptr = a; //modify value being pointed to by argument
    return ptr;
}

存在线程安全问题:返回指向a的非常量指针使得某个线程可能会在另一个线程读取该值时修改该值。数据争用具有未定义的行为。

我还要抛出返回原始指针是可怕的做法,因为我在其他答案中没有看到它。 int& func()应该是首选。