变量的内存分配与printf()函数
2016-04-09 15:11
316 查看
首先来看下面一个简单的代码,程序和生活一眼个,其实里面很多都不是我们想象的那样执行的,的知道它里面的工作方式:
#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()函数的工作方式就是,从右往左,以栈的方式来工作的!
其实这些小问题只要弄清工作方式就不会错了!
#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()函数的工作方式就是,从右往左,以栈的方式来工作的!
其实这些小问题只要弄清工作方式就不会错了!
相关文章推荐
- JSP中的<%=表达式%>和<%表达式%>有什么区别?
- sort用法
- 探索Java interface和abstract类的秘密
- iOS 使用NTP时间同步服务
- px、dp和sp,这些单位有什么区别
- Linux安装GCC
- poj 2774
- Android获取当前连接的wifi名称
- MySQL中常用的SQL Mode
- 关于C++中子类调用父类方法的一个问题
- 抽象类和接口
- 巨型日志处理系统
- LNMP
- 【剑指 offer】(十九)—— 二叉树镜像
- Zabbix3.0LTS安装
- ubuntu操作命令
- windows下创建并使用动态链接库(.dll)
- 深入JVM系列(一)之内存模型与内存分配
- 记录一个时间,说一下自己的感受
- android raw与assets区别