一次定义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个字节?的主要内容,如果未能解决你的问题,请参考以下文章

变量类型构造器封装以及 LeetCode 每日一题

C语言中定义int变量,默认值是多少

变量的基本类型与零值-GOLANG

在jsp中的局部和全局变量

在jsp中的局部和全局变量

019:函数:我的地盘听我的