各变量在内存中存储情况分析,格式输出问题

开发平台:VC++6.0Windows7 32位

预备知识:

要分析我们这里的内容,我们对于下面这个窗口要熟悉一下。


窗口介绍:这里我简单介绍一下这个界面,最上面那个条形窗口是可以输入32位地址的地方,下面这部分包含内存块首地址、相应地址对应的值以及这个值对应的内容,而且每两个?在一起叫做内存单元,而且内存地址是从低到高的。如下图所示:


这个窗口是我们在调试的时候,查看内存地址用的。我们在程序中设置好了一个断点,然后点击F5,或者按如下图所示可以打开调试。


进入调试以后就会看到如下所示,跳到一个你事先设置好的断点处,如下所示:


当然,进入调试以后,就会在软件下方出现好几个窗口,刚开始我看到这些窗口都懵了,心想这是都是“啥玩意儿”啊,后面查了些资料总算是搞懂了许多。下面我们要用到3个窗口(Variables、Watch和Memory),当然这些窗口都可以在View->DebugWindows里找到,如果读者想了解更多的其他窗口,可以自行百度、google《VC++6.0调试教程》,还是有很多资源的。

char、short和int变量在内存中的存放情况

在我的系统中,char是8位,short是16位,int是32位。所以可以知道在内存中存放时,它们分别占用的是char(1个内存单元)short(2个内存单元)int(4个内存单元),为了看到它们的存放情况,我用了一个共同体让这个三个类型共享一块内存。下面看下实例代码:

#include <stdio.h>

//内存共用
union {
	char *pca;
	short *psa;
	int *pia;
} data;

int main() {
	char ca[] = {1, 2, 3, 4};	//8位,1个字节
	short sa[] = {1, 2, 3, 4};	//16位,2个字节
	int ia[] = {1, 2, 3, 4};	//32位,4个字节
	int i;
	
	printf("第一种测试方式:\n");
	data.pca = ca;
	for (i=0; i<4; i++) {
		printf("pca(10进制) = %d,\tpsa(10进制) = %d,\tpia(10进制) = %d\n", 
			*(data.pca + i), *(data.psa + i), *(data.pia + i));
		printf("pca(16进制) = %#x,\tpsa(16进制) = %#hx,\tpia(16进制) = %#x\n\n", 
			*(data.pca + i), *(data.psa + i), *(data.pia + i));
	}
	
	printf("第二种测试方式:\n");
	data.psa = sa;
	for (i=0; i<4; i++) {
		printf("pca(10进制) = %d,\tpsa(10进制) = %d,\tpia(10进制) = %d\n", 
			*(data.pca + i), *(data.psa + i), *(data.pia + i));
		printf("pca(16进制) = %#x,\tpsa(16进制) = %#hx,\tpia(16进制) = %#x\n\n", 
			*(data.pca + i), *(data.psa + i), *(data.pia + i));
	}

	printf("第三种测试方式:\n");
	data.pia = ia;
	for (i=0; i<4; i++) {
		printf("pca(10进制) = %d,\tpsa(10进制) = %d,\tpia(10进制) = %d\n", 
			*(data.pca + i), *(data.psa + i), *(data.pia + i));
		printf("pca(16进制) = %#x,\tpsa(16进制) = %#hx,\tpia(16进制) = %#x\n\n", 
			*(data.pca + i), *(data.psa + i), *(data.pia + i));
	}

	printf("\n");
	return 0;
}

测试结果如下:



结果分析:从结果我们可以看出来,当你让这个结构体单元的指针类型指向相应类型的内存块时结果就是正确的,比如上面程序所说的,

data.pca = ca;
data.psa = sa;
data.pia = ia;

否则结果就是错误的。

至于其他的结果为什么是错误的呢,这里我就简单计算一下。

首先,data.pca =ca之后,那么就如图中最后一行显示那样,数字1, 2, 3, 4分配在0x0012FF7C开始的内存块内。

然后,用不同类型的指针去取地址值的时候就不一样了。char类型的指针每次取一个内存单元,short类型的指针每次取两个内存单元,int类型的指针每次取4个内存单元。

最后,我们可以开始计算其他类型的值为什么是那样的了。由于short每次是取两个内存单元,所以psa所对应的地址值分别是0x0201,0x0403,0xFFC0,0x0012,计算它们这些16进制对应的10进制数分别为513,1027,-64,18。Int的结果也是一样计算的,只是int型每次都是取4个内存单元,那么pia所对应的地址值分别是0x04030201,0x0012FFC0,0x004013C9,0x00000001,计算它们对应的10进制数分别为67305985,1245120,4199369,1。



猜你喜欢

转载自blog.csdn.net/u011248694/article/details/32935289