C语言中关于&的问题
希望能得到很全面的解释。inta=1;这个例子,有哪位高手能从内存管理的角度来解释这个问题吗?比如说inta=1;int*p=&a可以说是把a的地址放在指针p的内存中,每...
希望能得到很全面的解释。
int a =1;
这个例子 ,有哪位高手能从内存管理的角度来解释这个问题吗?
比如说 int a=1 ;int *p=&a
可以说是把a的地址放在指针p的内存中,每个内存都有他的编号,这个我是知道的。
但是 int a=1 ,那个a 是什么东西,从C语言的角度来说它只是一个变量,但是在内存中是怎么表示的呢,毕竟电脑只是对内存中的数据进行操作,它不知道哪个是a哪个是b。 int a 时候电脑会开辟一段内存空间(不管是2个还是4个字节了) 那段内存的编号应该没有变的 但是a 保存到了那里呢?
希望哪个高手能解释一下。。 感激不尽。
如果没有生成.exe 文件的话 所有的东西都还是在内存中的,如何解释。。
a到底是什么 展开
int a =1;
这个例子 ,有哪位高手能从内存管理的角度来解释这个问题吗?
比如说 int a=1 ;int *p=&a
可以说是把a的地址放在指针p的内存中,每个内存都有他的编号,这个我是知道的。
但是 int a=1 ,那个a 是什么东西,从C语言的角度来说它只是一个变量,但是在内存中是怎么表示的呢,毕竟电脑只是对内存中的数据进行操作,它不知道哪个是a哪个是b。 int a 时候电脑会开辟一段内存空间(不管是2个还是4个字节了) 那段内存的编号应该没有变的 但是a 保存到了那里呢?
希望哪个高手能解释一下。。 感激不尽。
如果没有生成.exe 文件的话 所有的东西都还是在内存中的,如何解释。。
a到底是什么 展开
3个回答
展开全部
test.c
int c;
int b = 0;
int main(){
int a = 3;
}
一般一个程序跑起来之后就叫做进程,所以说进程是动态的程序,程序是静态的进程。
简介
我们现在普遍使用的都市32位机器,一个进程跑起来有4G的虚拟内存空间,如果你质疑说你的电脑买来内存才1G,那这个4G是怎么回事,不是不够吗?
注意这个4G是虚拟地址空间,他是按需分配的,如果程序跑着跑着发现原来给他的空间不够了,他会去向物理内存申请空间,然后使用它,所以肯定用不掉4G的。(这个在计算机专用术语叫做lazy loading和page fault handler,你不搞os就忽略他,我实现过这些操作系统的内部,相信我)
4G空间,对于unix下的c程序来说,可以分为:
kernel image
stack
heap
data
bss(空的)
rodata
txt
unused
当然可能还包括I/O mapping的空间。
地址是kernel image最大,unused最小,所以地址0xffffffff是属于kernel的,
0是unused的,所以空指针NULL其实是指向未使用虚拟地址段的,他是受写保护的,所以任意一个像NULL写值的错做会报段错误。
你这个a就是在进程的堆栈(stack)里,而这个b是在data段里的。
一般你申明在程序中的非全局变量都市在堆栈上的,初始化的全局变量都在data段的,未初始化的全局变量在bss段(其实bss段可能长度为0,他在某些os的实现上是摆设),未初始化的全局变量都等于0.
还有就是编译器是分得清a和b的,因为会有符号表(symtable)记录每个变量的位置,他的地址(地址都市预编译好的),通过符号表,可以确定我们引用的是a还是b。
内存哪个不叫编号,叫地址,每个变量是一个家庭,他得有他的加,那么如果
int a = 0x01020304;
&a操作发现地址是0x8048902,那么从0x8048902~0x8048905的4个字节都是存放变量a的。假设你的机器是little endian(不解释这个是什么了,是一般pc上的规范存法),那么
0x...902: 04
0x...903: 03
0x...904: 02
0x...905 01
就是这么存的。
最后回答下这里某个地址的内容是怎么存的,了解下:
04是16进制的4,正好一个byte,表示成bit就是00000100,然后计算机最终转换成一个bit一个bit一存,存在你的ram即你平时买的内存里,他是volatile的(易失的),一断电就没了。
他的存储方法叫做触发器,jk或者t触发器,sr触发器,这种触发器电路是一种设计良好的锁存器电路,锁存器通过电路的天性能够保存上次的结果或者重置现在的结果或者取反。
把计算机最物理层的都和你讲了,看来你也云里雾里了,大致看看我前面写的就可以了,还有疑问可以提出来,给分吧,谢谢
int c;
int b = 0;
int main(){
int a = 3;
}
一般一个程序跑起来之后就叫做进程,所以说进程是动态的程序,程序是静态的进程。
简介
我们现在普遍使用的都市32位机器,一个进程跑起来有4G的虚拟内存空间,如果你质疑说你的电脑买来内存才1G,那这个4G是怎么回事,不是不够吗?
注意这个4G是虚拟地址空间,他是按需分配的,如果程序跑着跑着发现原来给他的空间不够了,他会去向物理内存申请空间,然后使用它,所以肯定用不掉4G的。(这个在计算机专用术语叫做lazy loading和page fault handler,你不搞os就忽略他,我实现过这些操作系统的内部,相信我)
4G空间,对于unix下的c程序来说,可以分为:
kernel image
stack
heap
data
bss(空的)
rodata
txt
unused
当然可能还包括I/O mapping的空间。
地址是kernel image最大,unused最小,所以地址0xffffffff是属于kernel的,
0是unused的,所以空指针NULL其实是指向未使用虚拟地址段的,他是受写保护的,所以任意一个像NULL写值的错做会报段错误。
你这个a就是在进程的堆栈(stack)里,而这个b是在data段里的。
一般你申明在程序中的非全局变量都市在堆栈上的,初始化的全局变量都在data段的,未初始化的全局变量在bss段(其实bss段可能长度为0,他在某些os的实现上是摆设),未初始化的全局变量都等于0.
还有就是编译器是分得清a和b的,因为会有符号表(symtable)记录每个变量的位置,他的地址(地址都市预编译好的),通过符号表,可以确定我们引用的是a还是b。
内存哪个不叫编号,叫地址,每个变量是一个家庭,他得有他的加,那么如果
int a = 0x01020304;
&a操作发现地址是0x8048902,那么从0x8048902~0x8048905的4个字节都是存放变量a的。假设你的机器是little endian(不解释这个是什么了,是一般pc上的规范存法),那么
0x...902: 04
0x...903: 03
0x...904: 02
0x...905 01
就是这么存的。
最后回答下这里某个地址的内容是怎么存的,了解下:
04是16进制的4,正好一个byte,表示成bit就是00000100,然后计算机最终转换成一个bit一个bit一存,存在你的ram即你平时买的内存里,他是volatile的(易失的),一断电就没了。
他的存储方法叫做触发器,jk或者t触发器,sr触发器,这种触发器电路是一种设计良好的锁存器电路,锁存器通过电路的天性能够保存上次的结果或者重置现在的结果或者取反。
把计算机最物理层的都和你讲了,看来你也云里雾里了,大致看看我前面写的就可以了,还有疑问可以提出来,给分吧,谢谢
展开全部
a这个变量名在编译后被丢弃,exe文件里只记录了这些变量的地址。
你生成exe并运行它以后所有东西才到内存里。a只是个名字,编译的时候用的,exe文件里没这些东西了。你先学学汇编就明白了。
你生成exe并运行它以后所有东西才到内存里。a只是个名字,编译的时候用的,exe文件里没这些东西了。你先学学汇编就明白了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果你学汇编就会知道,这些变量的名字都是为了给编译器识别才弄出来的,编译后都会被扔掉..
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询