这个静态变量赋值给局部函数中的指针有什么问题
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;
}
没有问题。 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()
应该是首选。
相关文章:
- 链表指针问题
- 指针问题:从不兼容的类型"int"分配给"int *"
- C++指针问题:如何修复这些代码中的错误?
- *++*++ppp,*++pp[1],*++(*(1+ppp)有什么具体的区别吗?(C/C++指针问题)
- C++ 入门加列表:10.9 "顶部"指针问题
- C++ 指针问题 - 通过方法更新指针
- 未分配正在释放的指针 - 指针问题
- 双指针问题通过函数传递错误
- 在C++中实现图形 DFS,指针问题
- 返回指针问题
- C++ - 有人有分析指针到指针问题的技巧吗?
- 选择排序指针问题
- 涉及删除操作的 C++ 指针问题
- 模板类指针问题 c++
- Swig和指针问题(python)
- 引用指针问题
- 函数指针问题
- 通过类型C++ 的继承树递归导致此指针问题
- 无法将文件读入字符数组(像往常一样,某些指针问题)
- 结构中的指针问题