// 函数不能返回函数内部局部变量的地址,因为这个函数执行完返回后这个局部变量已经不在了
// 这个局部变量是分配在栈上的,虽然不在了但是栈内存还在还可以访问,但是访问时实际上这个
// 内存地址已经和当时那个变量无关了。
int *func(void)
{
int a = 4; // a是局部变量,分配在栈上又叫栈变量,又叫临时变量
printf("&a = %pn", &a);
return &a;
}
void func2(void)
{
int a = 33;
int b = 33;
int c = 33;
printf("in func2, &a = %pn", &a);
}
void stack_overflow(void)
{
int a[10000000] = {0};
a[10000000-1] = 12;
}
void stack_overflow2(void)
{
int a = 2;
stack_overflow2();
}
int main(void)
{
//stack_overflow();
stack_overflow2();
/*
int *p = NULL;
p = func();
func2();
func2();
printf("p = %pn", p);
printf("*p = %d.n", *p); // 证明栈内存完了后是脏的
*/
return 0;
}
原文始发于微信公众号(汇编语言):浅谈c语言程序为什么需要内存 栈又是什么?
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论