C++ 在局部函数中将静态变量赋值给指针有什么问题?

C++ 在局部函数中将静态变量赋值给指针有什么问题?,c++,c,static,C++,C,Static,有人在采访中问我这个问题。现在关键是,变量“a”是静态的,因此,与声明的普通变量不同,声明的普通变量在函数返回时会丢失其值(从堆栈中弹出),该变量会保留其值,因为它是静态变量 然后我不明白,这段代码有什么问题?您传入的ptr的值(您指向的地址)没有在函数外部更改,因为您正在更改ptr的本地范围副本 它需要通过引用或指向指针的指针传入,才能更改 int* func(int *ptr) { static int a = 5; ptr = &a; return ptr; } 将p

有人在采访中问我这个问题。现在关键是,变量“a”是静态的,因此,与声明的普通变量不同,声明的普通变量在函数返回时会丢失其值(从堆栈中弹出),该变量会保留其值,因为它是静态变量

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

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

它需要通过引用或指向指针的指针传入,才能更改

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

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

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

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

我要提醒您注意局部静态变量。从上次调用开始,变量将一直保持不变。因此,如果增加变量
a=a+1
,那么下次该值保持为6。这是怎么发生的。在每次调用中,每个本地调用都会在内存中声明新空间。但在静态变量中,每次都要使用相同的内存。所以,指针将保持不变。这就是为什么你会得到相同的地址。这并非意外。

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

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

int* func()
{
  static int a = 5;
  return &a;
}
他们会有问题的

面试官可能一直在寻找以下解决方案:

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

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


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

为什么说有问题?我不相信有问题。谁/说了什么?好吧,它的函数参数是完全无用的。除此之外,我看不出任何问题。你为什么认为这可能有问题?@kingsmasher1根据我的经验,在面试中被问到并不能保证问题是好的。这不是问题。在OP的代码中,返回
ptr
值,因此代码也可以工作,只是方式不同。顺便说一句,return语句在代码中是错误的(而且是无用的,不是吗?),这是一个问题,因为它没有按照他认为的方式工作。正如上面的回答所暗示的,它是毫无意义的,但是它没有按照OPs代码中的方式工作。您确定它不应该是
return*ptr
?OPs签名允许类似
int*b(NULL)的内容;if(func(b)&&&*b>4){/*…*/}
int*b相反;如果((b=func())&&&*b>4){…
?@Pixelchemist我不确定你的意思,但是在你的例子中,
b
仍然是
NULL
,给出了未定义的行为。
int *func(int *ptr) {
    static int a = 5;
    *ptr = a; //modify value being pointed to by argument
    return ptr;
}