编辑:编辑了我的问题。感谢@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]
我在这里有点猜测,因为不清楚你想知道什么,但我想你在问a
和b
是否都指向分配后的同一内存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... | +---+ +-------------------------------+