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

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

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

4

6 回答 6

11

ptr作为参数没有意义。不使用传递的值。您可以将其更改为

int* func()
{
  static int a = 5;
  return &a;
}
于 2013-06-17T15:08:04.373 回答
1

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

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

int* func(int **ptr)
{
  static int a = 5;
  *ptr = &a;
  return *ptr;
}
于 2013-06-17T15:07:04.643 回答
1

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

于 2013-06-17T15:11:50.310 回答
0

我让你重新关注局部静态变量。自上次调用以来,所有时间变量都将保持不变。因此,如果您增加变量,a=a+1那么下次该值保持为 6。这是如何发生的。每个本地在每次调用中都在内存中声明新空间。但是在静态变量中,您告诉每次都使用相同的内存。因此,指针将保持不变。这就是为什么你得到相同的地址。这并不意外。

于 2013-06-17T15:20:17.903 回答
0

没有问题,除非调用者不理解函数的作用。这是很有可能的,因为人们可能会假设函数修改了参数指向的值。

例如,如果有人编写如下代码

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;
}
于 2013-06-17T15:27:47.463 回答
0

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

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

于 2013-06-17T15:39:46.360 回答