C语言中的变量的js 获取变量内存地址址是不是不变的

C语言变量的类型和存储位置
我的图书馆
C语言变量的类型和存储位置
1. C语言变量主要分为全局变量、静态全局变量、局部变量、静态局部变量和寄存器变量。其中静态变量用static关键字进行修饰。程序所占用的内存可以分为以下几个部分:
(1)代码段-存放程序代码,只读的,不能修改。
(2)全局区(静态区),又称为数据段。其中.data段存放的是已经初始化的全局变量和静态变量(静态全局变量和静态局部变量)。.bss段存放的是未初始化的全局变量和静态变量(静态全局变量和静态局部变量)。bss段会将未初始化的变量填充为0.
(3) 堆: 是一种线性结构,类似链表实现,也可由其它方法实现。malloc, realloc函数一般从堆上分配内存。注意:和数据结构中的堆不同。
(4) 栈: 后进先出结构。主要存储的是局部变量,函数形参,以及函数地址。
(5)常量区:存储字符串常量。
2. 变量的生存期和作用域
全局变量: 全局变量的作用域是整个源程序,即多个文件中有效。通过extern声明。
静态全局变量: 静态全局变量和全局变量的存储域是相同的,都存储在数据段。但作用域不相同,用static声明的静态全局变量作用域被限制在本文件内。在文件外是无效的。函数或变量前加static,可防止命名冲突。
局部变量: 局部变量是定义在函数体内的,当函数执行结束后,就自动释放。作用域为整个函数体。
静态局部变量: 与局部变量不同的是,它存储在全局区或是静态区,局部变量存储在栈上。静态局部变量的作用域也是函数体,函数体外无效。但当函数执行完之后,静态局部变量一直存在,下次调用时可以直接利用上次保存的值,即静态局部变量就初始化1次,不会重复初始化。
如果在头文件声明了静态变量,那么每个包含该头文件的源文件中的静态变量地址都是不相同的,即视为不相同的变量,这样可以防止变量重定义。也说明了静态全局变量将作用域限制在了文件内。
3. 可以通过readelf -a 可执行文件,查看每个段情况。
TA的最新馆藏[转]&[转]&
喜欢该文的人也喜欢欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 5282 人关注过本帖
标题:普通的变量是在编译时还是在运行分配内存单元的?
等 级:新手上路
帖 子:18
结帖率:80%
&&问题点数:0&&回复次数:14&&&
普通的变量是在编译时还是在运行分配内存单元的?
谭浩强《C程序设计》第二版中有以下文字描述,我觉得近似乎矛盾了,普通变量的存储单元是什么时候分配的?全局变量的情况又是怎么样的呢?
pg40&&“第一个变量被指定为一确定的类型,在编译时就能为其分配相应的存储单元。”
pg201 “如果在程序中定义了一个变量 ,在编译周日就给这个变量分配内存单元。”
pg173 “函数中的局部变量,如不专门声明为static类型存储类别,都是动态分配存储空间的,数据存储在动态存储区中。函数中的形参和函数中定义的变量,都属此类,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间。”
搜索更多相关主题的帖子:
&&&&&&&&&&
等 级:论坛游侠
帖 子:67
专家分:144
写了个程序,不知道你看不看懂~
程序代码:#include &stdio.h&
#include &stdlib.h&
struct Test&&&&&&&&&&&&//Test结构体
&&& struct Test *
void test()
&&& int TestNum1 = 1;&&&//局部变量,生存期是函数开始到函数结束;
&&& static TestNum2 = 1;&&//静态局部变量,函数结束时不会消失;
&&& TestNum1++;
&&& TestNum2++;
&&& printf(&Number1 = %d\n&,TestNum1);
&&& printf(&Number2 = %d\n&,TestNum2);
void main()
&&& int num = 0;&&&&&&&&&&&//确定类型,程序编译时自动分配空间
&&& struct Test *p;&&&&&&&&&&&& //指针类型,它如果要指向结构体,就要给它分配空间;
&&& p = (struct Test *)malloc(sizeof(struct Test));&&//手动分配空间;否则会出错
&&& test ();&&&&&&&&&&&&&&&&&
&&& test ();
//调用两次test函数,运行得TestNum1两次运行都为2;TestNum2第一次为1,第二次为3;可知TestNum2在函数结束时没有释放储存空间
等 级:新手上路
帖 子:18
谢谢您的回复,您举例的程序我是能够看懂的。我现在不解的问题是,如果auto型的局部变量是在编译时分配内存的(也就是分配个内存地址),
那么在整个程序运行的过程中这个空间不就不可以由其它的数据占用了,甚至出现一种极端的情况是这个程序运行前,该地址就已经被其他程序占用了。
出现这种情况怎么办,是不是采取相对地址
等 级:新手上路
帖 子:18
也就是说分配的是相对地址!!!!
等 级:论坛游侠
帖 子:67
专家分:144
相对地址?
如果没空间,程序应该会出错~~
你的观点是不是“程序分配空间时,变量有一个固定的地址”?
程序分配变量空间应该是从未利用的内存中划分的,变量地址不固定~程序运行后,变量才产生一个地址
等 级:职业侠客
帖 子:208
专家分:346
回复 楼主 zhenhang
在c程序里只有全局和静态变量有固定的逻辑地址(通常存在于数据段中),而所有局部变量的逻辑地址是运行时确定的,局部变量都是在运行时从栈分配的内存。
在编译时产生的目标文件都是从地址0开始的,在连接时将各个目标文件进行符号替换,这时会修改相应的地址,最后产生一个从地址0开始的可执行文件。在该可执行文件中的地址称为逻辑地址,也就是在c中所说的内存地址。在运行时加载器会把可执行程序(通常是可执行程序的一部分)加载到某个不定的内存区域中(每次加载到的物理内存地址不一定相等),这时如果使用逻辑地址进行寻址,那么逻辑地址会先通过分段单元装换成线性地址,然后线性地址通过分页单元(在这会使用到页表)转换成实际的物理地址。(这里以x86为原型)
身体是玩命的本钱
等 级:新手上路
帖 子:18
回复 6楼 zhddragon
这个问题我感到非常苦恼,您能否留下QQ什么的联系方式,我想进一步向您讨教!!!我的QQ是。
来 自:北京
等 级:贵宾
威 望:94
帖 子:6779
专家分:16751
所谓分配了空间,就是给它留个地。不用深究这个问题我觉得,这个问题我觉得老谭瞎讲,说得根本不清楚。
来 自:北京
等 级:贵宾
威 望:94
帖 子:6779
专家分:16751
6 楼说的那些是对的,但这些不是从 C 语言这个层面讨论的。他说了编译后的链接的一些知识,还说了一些寻址相关的东西。反正会的多了,这种确实不是问题。
楼主要想知道的稍多一些的话,学学 汇编语言 可能好一些。所谓变量的概念,在那之后可能就更清楚了。
等 级:黑侠
帖 子:216
专家分:515
全局变量存放在全局数据段中,这些变量的地址在编译后就应该确定了。
局部变量则是存放在堆栈中,通过栈顶地址加上偏移来寻址。
当然,这儿讲得简单了点,实际的还要复杂些。
学了汇编和指令寻址之后,你就会有更深入的了解。
版权所有,并保留所有权利。
Powered by , Processed in 0.044191 second(s), 7 queries.
Copyright&, BCCN.NET, All Rights Reserved欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 556 人关注过本帖
标题:关于C语言变量地址不变的问题,问题如下图
等 级:论坛游民
帖 子:25
专家分:16
结帖率:100%
&&问题点数:0&&回复次数:3&&&
关于C语言变量地址不变的问题,问题如下图
程序代码:int dataType01() {
&&& int num=<font color=#;
&&& int* p = &
&&& printf(&\n&num = %d&,&num);
&&& printf(&\nnum = %d&,num);
&&&&&&&&/*
&&&&&&&&&&&&第一次编译运行结果:&num = 2358804
&&&&&&&&*/
&&& return <font color=#;
程序代码:
int dataType01() {
&&& int num=<font color=#;
&&& int* p = &
&&& printf(&\n&num = %d&,&num);
&&& printf(&\nnum = %d&,num);
&&& *((int*)<font color=#8804) = <font color=#;
&&& printf(&\nnum = %d&,num);//num没有被释放?
&&&&&&&&&/*
&&&&&&&&&&&&第二次编译运行结果:&num = 2358804
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&num = 10
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&num = 20
&&&&&&&&*/
&&& return <font color=#;
问题:num不是在栈中嘛,第一次编译运行完后,num被释放掉,然后第二次编译运行不是应该重新分配内存嘛,但为什么两次取出来num的地址是一样的呢
,这是巧合还是什么原因??
搜索更多相关主题的帖子:
等 级:新手上路
你程序没变啊,只不过是编译了两次而已,那个num每次都是从栈区同一个地方分配内存,地址当然一样的,你如果在之前再添加几个变量,那地址肯定就变了。
来 自:流年
等 级:贵宾
威 望:82
帖 子:2786
专家分:14619
但是程序每次运行都是从同一个地方开始分配空间的吧,又不是随机分配的
一片落叶掉进了回忆的流年。
等 级:职业侠客
帖 子:89
专家分:341
这里的地址应该都是相对自己的进程空间而言的
不是绝对的物理地址
版权所有,并保留所有权利。
Powered by , Processed in 0.041535 second(s), 7 queries.
Copyright&, BCCN.NET, All Rights Reserved

我要回帖

更多关于 php 查看变量内存地址 的文章

 

随机推荐