变量的内存分配与printf()函数

首先来看下面一个简单的代码,程序和生活一眼个,其实里面很多都不是我们想象的那样执行的,的知道它里面的工作方式:

#include <stdio.h>
int main()
{
	char c1;
	char c2;
	printf("%p\n",&c1); //0012ff44
	printf("%p\n",&c2); //0012ff40
	return 0;
}

从上面的例子我们可以看出,输出的地址为什么,c2的地址会比c1的小呢,不应该是先给c1分配吗?

但是我相信很多人也都了解了其中的原因了,这确实是个小问题!


我们都知道自动变量和静态变量都是局部变量,这是相同点。

不同的是,自动变量在函数每次运行的时候都要被重新创建,函数结束的时候,这些自动变量所占空间也被自动收回。

静态变量它不会随着函数的调用和退出发生变化的,也就是说,在上次调用函数的时候如果我给静态变量赋了某个值的话,下次调用该函数的时候, 这个值将保持不变。

自动变量(即动态局部变量)属于动态存储类别,占动态存储区空间而不占静态存储空间,函数调用结束后立即释放。它分配内存的空间的时候是以栈的方式分配的。

c1进入后压栈,然后再进入c2,没有变量了,就为c2分配空间,然后c1,所以导致c1的地址小于c2@!!

顺便说一句因为我的电脑测试为小端,否则结果可能相反。

再来看下面一道题:

#include <stdio.h>
int main()
{

	int b=3;
	int arr[]={6,7,8,9,10};
	int *p=arr;
	*(p++)+=123;  //*p=*p+123=arr[0]=129
	printf("%d,%d\n",*p,*(++p));  //8,8
	return 0;
}
从上面的结果看:为什么不是:7,8,而是8,8,呢,其实道理很简单,printf()函数的工作方式就是,从右往左,以栈的方式来工作的!

其实这些小问题只要弄清工作方式就不会错了!





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值