C 中局部变量的返回地址

问题描述 投票:0回答:5

假设我有以下两个功能:

1

int * foo()
{
  int b=8;
  int * temp=&b;
  return temp;
}

2

int * foo()
{
   int b=8;
   return &b;
}

我没有收到第一个警告(例如,函数返回局部变量的地址),但我知道这是非法的,因为

b
从堆栈中消失,我们留下了一个指向未定义内存的指针。

那么什么时候我需要小心返回临时值的地址?

c return return-value
5个回答
21
投票

在第一个代码片段中没有收到警告的原因是因为您没有(从编译器的角度)返回局部变量的地址。

您正在返回

int * temp
的值。即使这个变量可能(在本例中)包含一个局部变量地址的值,编译器也不会向上执行代码堆栈来查看是否是这种情况。

注意这两个片段同样糟糕,即使您的编译器不会就前者发出警告。不要使用这种方法。


将地址返回给局部变量时应始终小心;通常,您可以说您永远不应该。

static

变量是一种完全不同的情况,这正在
这个线程中讨论。


2
投票
我想说你可以返回局部变量或者指向这样的指针,如果它是由malloc动态分配的,在这种情况下,用于存储变量的内存希望位于堆栈上而不是堆上,并且不会被清除或重新使用退出函数后,就像在自动局部变量(不使用 malloc 创建)的情况下发生的那样,我对吗?


0
投票
这两个例子同样不正确。我的猜测是,您的编译器没有看到危险,因此当您将地址存储在临时变量中时不会发出警告。


0
投票
这个问题可能是 Stack Overflow 上讨论最多的问题之一。下面是 Stack Overflow 上类似问题的两个回复,我觉得这很有趣,并且可能让我放弃了取消引用局部变量的坏习惯,尽管我犯错(未定义行为)的可能性非常小。

这是一个简单的答案

我特别喜欢这个回复。

这是一个示例,其中这种不良做法导致了一些真正的硬件损坏


-1
投票
这些都是不好的,一个好的编译器应该能够检测并警告这两种情况。通过将警告级别调至最大(无论如何您始终应该这样做)并打开优化,您可能会获得更好的结果。

© www.soinside.com 2019 - 2024. All rights reserved.