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;
}
存在线程安全问题:返回一个非常量指针 toa
使得某个线程可能会在另一个线程正在读取该值时修改该值。数据竞争具有未定义的行为。
我还要折腾返回原始指针是一种可怕的做法,因为我在其他答案中没有看到它。int& func()
应该是首选。