目的:我们想了解变量声明时计算机究竟做了什么
以下是VC++编译环境下的C程序
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
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 烫烫烫汤...