您的函数可能会打印 5,但您永远不应该这样做。这是未定义的行为,因为您的程序不再拥有返回的指针所指向的位置(换句话说,您的程序不再拥有i
)。
基本上每次调用函数时,堆栈指针都会被下推以容纳新的堆栈帧。当函数调用结束时,堆栈指针会重新升起。这意味着如果要调用不同的函数,它将与前一个函数调用重叠相同的堆栈空间。
为了更好地说明这一点,请考虑以下内容:
int main()
{
int *p;
p=func();
printf("%d\n",*p);
func2();
printf("%d\n",*p);
return 0;
}
int *func()
{
int i;
i=5;
return &i;
}
void func2()
{
int i = 1;
}
输出很可能是 5 1。这是因为第二次调用将重用相同的堆栈空间。
(请注意,上面的代码片段很糟糕——你永远不应该做这样的事情——它是未定义的行为并且高度依赖于实现。)
直接回答您的问题:
i 的范围在 func() 中完成,但是,由于我返回 i 的地址,我是否能够在 main() 中访问和 print5?
不,你可以,但你不应该。这就是 C 的美妙之处。根据编译器/操作系统/等,它可能输出 5,或者它可能输出随机车库。
如果不是,为什么?编译器是否在该地址空间中放置了一个垃圾值(我认为这还没有完成)。
用于局部变量的空间被重用。希望答案的前半部分说明了这是如何工作的。(嗯,它通常是如何工作的。)
变量的范围结束实际上意味着什么?分配给 i 的内存是否在其范围结束时被释放?
基于堆栈的内存分配是幕后发生的事情。