[英]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.