c语言中的陷阱(2)

int* test()
{
	int a = 10;
	return &a;
}
int main()
{
	int* p = test();
	printf("%d\n", *p);
	return 0;
}

关于此代码:(其实是一个野指针问题)

(1)test函数中临时创建了变量a,然后返回的是a的地址,在返回结束test函数的栈帧会销毁

(2)主函数中用指针变量p来接收a的地址,但是由于a在test函数调用完成后就会被销毁,从而导致我们可以通过p来找到a的地址,但是找不到a的内容,因为此时该内容已经不属于此时此刻所运行的程序,被还到了原来的内存之中,所以此时此刻p就成为了野指针

(3)但此代码运行结果却是10(在vs中),如图所示:

 但但当用接下来的代码运行结果就会发生变化:

代码:

int* test()
{
	int a = 10;
	return &a;
}
int main()
{
	int* p = test();
	printf("hehehe\n");
	printf("%d\n", *p);
	return 0;
}

结果:

 原因:第一个printf函数再调用是,覆盖了之前调用test函数所用的空间,此时原来a处的值就有可能被改变(如果对函数栈帧创建与销毁有了解的话应该很容易懂)

在测试:(每一次覆盖都不同)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值