C中局部variables的返回地址
假设我有以下两个function:
1
int * foo() { int b=8; int * temp=&b; return temp; }
2
int * foo() { int b=8; return &b; }
我没有得到任何第一个警告(例如函数返回一个局部variables的地址 ),但我知道这是非法的,因为b
从堆栈中消失,我们剩下一个指向未定义内存的指针。
那么我什么时候需要注意返回临时值的地址呢?
您在第一个片段中没有得到警告的原因是因为您没有从编译器的angular度将地址返回到局部variables。
你正在返回int * temp
的值。 即使这个variables可能(在这个例子中)包含一个值是一个局部variables的地址,编译器将不会去代码执行堆栈看是否是这种情况。
注意 : 即使你的编译器没有警告你前面的内容,这两个代码片段也是一样糟糕的。 不要使用这种方法。
将地址返回给局部variables时,应该小心; 作为一个规则,你可以说,你永远不应该。
static
variables是一个完全不同的情况,这是在这个线程中讨论。
我会说,你可以返回本地variables,而不是指向这样的IF,它是由mallocdynamic分配的,在这种情况下,用于存储variables的内存需要在堆栈上,但在堆上,不会被清除或重新使用后退出函数,因为它发生在自动局部variables(没有malloc创build)的情况下,我是吗?
这两个例子都是不正确的。 我的猜测是,你的编译器没有看到危险,因此当你将地址存储在一个临时variables中时不会发出警告。
这个问题可能是StackO上讨论最多的问题之一。 下面是StackO上类似线程的两个回复,我发现它很有趣,可能让我离开了这个不好的做法,去掉了引用局部variables,尽pipe我得到一个错误(未定义行为)的机会非常渺茫。
这是一个简单的答案
我特别喜欢这个答复。
这是一个例子,这个不好的做法造成了一些真正的硬件损害
这些都不好,一个好的编译器应该能够检测和警告这两种情况。 您可以通过将警告级别设置为最大(您总是应该这样做)来获得更好的结果,并打开优化。