c语言 - 为什么我在编译时得到"warning: function returns address of local variable [-Wreturn-local-addr]"?



编辑:编辑了我的问题。感谢@SomeProgrammerDude帮助我了解我做错了什么,(我混淆了数组和指针,这里有一个帮助我的相关主题:数组类型和使用 malloc 分配的数组之间的区别(。

假设我在函数内声明并初始化了一个数组"a",如果我在函数外部声明一个指针"b"并尝试返回转换为指针的"a":

uint8_t *b;
uint8_t * foo(void){
unint8_t a[size] = {'a', 'b', ...};
return (uint8_t *) a;
}
b = foo(b);

为什么我得到 :

warning: function returns address of local variable [-Wreturn-local-addr]

我在这里有点猜测,因为不清楚你想知道什么,但我想你在问ab是否都指向分配后的同一内存c = a

在这种情况下,答案是肯定的。

+---+ +-------------------------------+ |一 |--> |内存分配由 malloc... | +---+ +-------------------------------+

如果我们从图形上看,a = malloc(...)之后你会得到类似的东西

+---+ +-------------------------------+ |一 |--> |内存分配由 malloc... | +---+ +-------------------------------+

然后在分配c = a之后,你有类似的东西

+---+ |一 |--\ +---+    \     +-------------------------------+>--> |内存分配由 malloc... | +---+   /    +-------------------------------+ |c |--/+---+

return c之后,有了b = foo(b),那么你只有

+---+ +-------------------------------+ |乙 |--> |内存分配由 malloc... | +---+ +-------------------------------+

重要提示:除非您以其他方式知道分配的内存的大小,否则使用分配的内存可能会很麻烦,因为您不知道它的结束位置。越界会导致未定义的行为

但是,只要您保持在分配内存的边界内,您就可以以任何您喜欢的方式使用它。您可以写入它,也可以通过取消引用指针b从中读取。


另一个重要的注意事项:将参数传递给foo是无关紧要的,foo函数可以很容易地return a而不打扰参数,最终结果(b指向内存(将是相同的:

uint8_t foo(void)
{
uint8_t *a = malloc(...);
return a;
}

甚至不需要变量a

uint8_t foo(void)
{
return malloc(...);
}

使用上述这两个函数,b = foo()后的最终结果仍然是

+---+ +-------------------------------+ |乙 |--> |内存分配由 malloc... | +---+     +-------------------------------+

相关内容

最新更新