自动变量的内存分配和值存储[c][code]

目的:我们想了解变量声明时计算机究竟做了什么

以下是VC++编译环境下的C程序

#include  < stdio.h >

struct  Test
{
    
int  x;
    
int  y;
};

main()
{
    
short  x[ 5 ];    
    x[
0 =   1 ;
    x[
4 =   2 ;
    
    
struct  Test test;    
    test.y 
=   5 ;
    test.x 
=   4 ;
    
    
int  y;
    y 
=   3 ;

    
return   0 ;
}

 

如上所示:先声明数组x,对数组赋值;再声明结构test,对其中的成员赋值;最后声明一个变量y,赋值。我们来分析它在VC编译器下的运行过程。

先在语句 x[0]=1; 前面设置断点,再单步运行。以下是各个量的观察值和内存的变化情况:

Step1. 单步运行完语句short x[5];后

Name      Value
&x          0x0012ff74 "烫烫烫烫烫烫?"
&test      0x0012ff6c
&y          0x0012ff68

Memory:

0012FF58  CC CC CC CC CC CC CC CC CC CC CC  烫烫烫烫烫.
0012FF63  CC CC CC CC CC CC CC CC CC CC CC  烫烫烫烫烫.
0012FF6E  CC CC CC CC CC CC CC CC CC CC CC  烫烫烫烫烫.
0012FF79  CC CC CC CC CC CC CC C0  FF 12  00  烫烫烫汤...

可以看出,此时所有的变量都指定了内存地址,与它们在程度中的声明位置无关。

注意:在Turbo C中,以块为单位,必须先声明完块中的所有变量。如下程序在Turbo C中将出现语法错误(编译错误):

Error: Expression syntax in function main

Error: Undefined symbol 'd' in function main

#include " stdio.h "

struct  Test
{
   
int  x;
   
int  y;
};

main()
{
   
int  a;
   
int  b;
   
struct  Test test;
   test.x
= 10 ;
   test.y
= 20 ;
   a
= 3 ;
   b
= 4 ;
   {
       
int  c;
       c
= 30 ;
       
int  d;
       d
= 40 ;
   }
   printf(
" a=%d, b=%d, test.x=%d, test.y=%d " ,a,b,test.x,test.y);
}

 

Step2. 单步执行完语句x[0]=1;后

Name      Value
&x          0x0012ff74 ""
&test      0x0012ff6c
&y          0x0012ff68

Memory:

0012FF58  CC CC CC CC CC CC CC CC CC CC CC  烫烫烫烫烫.
0012FF63  CC CC CC CC CC CC CC CC CC CC CC  烫烫烫烫烫.
0012FF6E  CC CC CC CC CC CC 01 00 CC CC CC  烫烫烫烫烫.
0012FF79  CC CC CC CC CC CC CC C0  FF 12  00  烫烫烫汤...

 

Step3. 单步执行完语句x[4]=2;后

Name      Value
&x          0x0012ff74 ""
&test      0x0012ff6c
&y          0x0012ff68

Memory:

0012FF58  CC CC CC CC CC CC CC CC CC CC CC  烫烫烫烫烫.
0012FF63  CC CC CC CC CC CC CC CC CC CC CC  烫烫烫烫烫.
0012FF6E  CC CC CC CC CC CC 01 00  CC CC CC  烫烫烫烫烫.
0012FF79  CC CC CC 02 00 CC CC C0  FF 12  00  烫烫烫汤...

 

Step4. 单步执行完语句test.y=5;后

Name      Value
&x          0x0012ff74 ""
&test      0x0012ff6c
&y          0x0012ff68

Memory:

0012FF58  CC CC CC CC CC CC CC CC CC CC CC  烫烫烫烫烫.
0012FF63  CC CC CC CC CC CC CC CC CC CC CC  烫烫烫烫烫.
0012FF6E  CC CC 05 00 00 00 01 00  CC CC CC  烫烫烫烫烫.
0012FF79  CC CC CC 02  00 CC CC C0  FF 12  00  烫烫烫汤...

 

Step5. 单步执行完语句test.x=4;后

Name      Value
&x          0x0012ff74 ""
&test      0x0012ff6c
&y          0x0012ff68

Memory:

0012FF58  CC CC CC CC CC CC CC CC CC CC CC  烫烫烫烫烫.
0012FF63  CC CC CC CC CC CC CC CC CC 04 00  烫烫烫烫烫.
0012FF6E  00 00 05 00 00 00 01 00  CC CC CC  烫烫烫烫烫.
0012FF79  CC CC CC 02  00 CC CC C0  FF 12  00  烫烫烫汤...

 

Step6. 单步执行完语句y=3;后

Name      Value
&x          0x0012ff74 ""
&test      0x0012ff6c
&y          0x0012ff68

Memory:

0012FF58  CC CC CC CC CC CC CC CC CC CC CC  烫烫烫烫烫.
0012FF63  CC CC CC CC CC 03 00 00 00 04 00  烫烫烫烫烫.
0012FF6E  00 00  05  00 00 00  01 00 CC CC CC  烫烫烫烫烫.
0012FF79  CC CC CC 02  00 CC CC C0 FF 12  00  烫烫烫汤...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值