打印C语言的变量地址和内容

发表于:2015年1月17日 21:32  分类:c 896次浏览

编写一个C程序,打印int、long、double型变量所占的字节数、地址、各个字节的地址和内容。
首先,编写如下程序:

cprint1

Tcc工具编译、连接生成exe文件(出现warnning:定义的变量没有使用过,忽略)。

cprint2

使用debug查看代码。

cprint3

定位到main函数开始的位置,在栈中开辟a个字节,用于存放局部变量a、b、c。
a=1是int型数据变量,占2个字节,所在的开始地址为ss:FFDE,第一个字节内容为01,第二个字节内容为00。
b=8是long型数据变量,占4个字节,所在的开始地址为ss:FFE0,第一个字节内容为08,第二个字节内容为00,第三个字节内容为00,第四个字节内容为00。
C=0.325是float型数据变量,占8个字节,因为是浮点数据,所以按照浮点类型的存储结构存储。所在的开始地址为ss:FFE4,第一个字节的内容为D7,第二个字节的内容为A3,第三个字节的内容为B0,第四个字节的内容为3E。

cprint4

然后,更新上面的程序代码:

cprint5

编译连接、直接运行。

cprint6

分行打印出“变量的名称: 字节数 地址 | 各个字节的地址 内容…”
对比刚才分析的变量存放的地址,输出的结果和推理的结果不同,但输出的字节内容是正确的。考虑到先前的分析是建立在调试器中的,初步猜想是直接运行和调试器加载的内存分配方式不同(出栈、入栈的情况不同)。于是,用debug加载新的exe程序,g命令执行,结果如下,跟先前的分析结果一致。

cprint7

同一个程序,输出的结果却不同,具体原因是什么呢?
仔细观察变量存储的栈段代码。

1

红色框中是变量a、b、c的内容,绿色框中的是文件信息。两种框之间的栈段存储地址信息,在不同的加载情况下(直接运行,或用debug加载运行等)字节长度应该不变,但蓝色框中的文件信息可变(比如只记录文件名,或记录文件路径等),所有造成了输出结果的不同。

更新:之前定义p的时候有误,指针变量存储的是内存地址,内存地址是无符号整数,如果将指针变量p定义为有符号整数,因为有符号整数的最大值小于无符号整数的最大值,所以p有可能会溢出,造成格式化输出错误。更新程序源代码即可。

cprintf+
cprintf++

发表评论

电子邮件地址不会被公开。 必填项已用*标注