一次定义2个int类型局部变量,这两个局部变量的地址为啥相差12个字节?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一次定义2个int类型局部变量,这两个局部变量的地址为啥相差12个字节?相关的知识,希望对你有一定的参考价值。
首先要达成共识的是:函数内的局部变量本身就是栈变量,栈的地址肯定是连续的,而且栈变量的地址是逐渐递减的。
亲自测试了一下,在windows环境下每个变量的地址都是-12的
而在linux-rhel-5.5下测试,分配的地址是按实际的变量所占空间递减的
这二点的不同应该是编译器决定的。
以下是linux下测试的结果:
参考技术A 变量a和变量b不存在内存上的类似于数组元素之间的那种联系,就是说,数组相邻元素的地址值相差肯定是确定的,但是任意两个变量之间是没有这种联系的,
你也可以把a,b看正是只有一个元素的数组,然后你比较a,b,arr[0]或arr[9]之间的内存差,它们肯定是不一样的
希望可以帮到你!追问
一个int类型4字节,a b内存地址相差12字节,还有8字节用来干什么了?
追答程序运行需要内存,这应该是在函数被调用时的该函数的内存开销!
参考技术B 你不要在debug下运行,要在release下运行,就能得到你想要的答案,debug模式下插入了很多与你自己写的程序无关的东西。。。。 参考技术C 可以换release编译运行下,debug模式下可能会插入一些调试性代码。实测在release版本,相隔4字节。 参考技术D 申请两个独立的变量,地址不是紧挨着分配的,是系统随机分配的追问每次相差都是12字节,应该不是随机分配的吧?
追答每次相差12字节是有可能的,所谓的随机分配也就是系统检测缓冲区片可能空间大小,符合要分配大小,就分配出去,所以是有可能的,你可以试验不同机器上运行,不同系统环境下运行就知道结果了
C语言中定义int变量,默认值是多少
如果是定义的全局变量或者静态变量,未初始化的话就是0.如果是局部变量,那就是以前残留在堆栈里的随机值。
区分变量的类型,有两种情况。
1、局部变量。
局部变量在没有显式初始化时,其值C语言规范没做要求,可以是随机值,也可以是编译器随意给定的值。
比如gcc编译器的局部变量就是随机值,可能为任何值。而微软的编译器,如VC或VS,则会初始化为全c,即0xCCCCCCCC。
2、全局变量或静态局部变量。
所有的全局变量,即定义在函数外的变量,默认值为0。
所有的静态局部变量,即定义在函数内部的static int name形式的,默认初始化为0。
扩展资料:
int是一种数据类型,在编程语言(C、C++、C#、Java等)中,是用于定义整数类型变量的标识符。
目前在一般的电脑中,int占用4字节,32比特,数据范围为-2147483648~2147483647[-2^31~2^31-1]
在之前的微型机中,int占用2字节,16比特,数据范围为-32768~32767[-2^15~2^15-1]
定义方法:
int i;//定义整形变量i
int i=1;//定义整形变量i并初始化为1
定义常量:
const int i;//编译错误,因为常量需要给予一个初值
const int i=1;//定义常量i,值为1
Java定义常量:
final int i=1;//定义常量i,值为1
参考资料来源:百度百科-INT (数据类型)
参考技术A 区分变量的类型,有两种情况。1 局部变量。
局部变量在没有显式初始化时,其值C语言规范没做要求,可以是随机值,也可以是编译器随意给定的值。
比如gcc编译器的局部变量就是随机值,可能为任何值。而微软的编译器,如VC或VS,则会初始化为全c,即0xCCCCCCCC。
2 全局变量或静态局部变量。
所有的全局变量,即定义在函数外的变量,默认值为0。
所有的静态局部变量,即定义在函数内部的
static int name;
形式的,默认初始化为0。 参考技术B 如果是定义的全局变量或者静态变量,未初始化的话就是0.如果是局部变量,那就是以前残留在堆栈里的随机值。本回答被提问者和网友采纳 参考技术C c不负责初始化空间 参考技术D 如一楼
以上是关于一次定义2个int类型局部变量,这两个局部变量的地址为啥相差12个字节?的主要内容,如果未能解决你的问题,请参考以下文章