繁体   English   中英

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

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

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

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

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

ptr作为参数没有意义。 不使用传递的值。 你可以改成这个

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

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

它需要通过引用或指针传入,以便更改它。

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

没有问题。 a是静态的,因此它在执行的生命周期中存在。 这是外界语法隐形func 您只是返回一些“隐藏”全局变量的地址。

我正在引起你对本地静态变量的关注。 所有时间变量将与上次调用保持相同。 所以,如果你增加变量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()应该是首选。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM