|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 jiuyuan 于 2019-8-9 22:06 编辑
[i][i]代码我重新贴在下面楼层了,好像是3楼。我不太会排版,(我不知道怎么把代码和文本放在一起,放一起总有一方会乱),大家将就看下。抱歉。
****************************************************************************************************************************************我发不了图片,就打出来书中的描述:
对于跨越多字节的程序对象,我们必须建立两个规则:这个对象的地址是什么,以及在内存中如何排列这些字节。在几乎所有的机器上,
多字节对象都被存储为连续的字节序列,对象的地址为所使用的字节中最小的地址。例如,假设一个类型为int的变量x的地址为0x100,也就是说地址表达式&x的值为0x100。
那么,(假设数据类型int为32位表示)x的4个字节将被存储在内存的0x100,0x101,0x102和0x103位置。
***************************************************************************************************************************************
我的处理器是i特尔的,按小端模式存储int类型变量。用的c编译器int是4字节的。
下面是上述程序的运行结果:
62fe44
62fe20
78
62fe21
56
62fe22
34
62fe23
12
两个问题:1 &a的值按书上的说法,值是0x62fe44,然后a的其他部分应该被存储在0x62fe45,62fe46,62fe47位置啊.
2(去掉主函数的注释)如果再声明一个int变量b,程序结果如下,怎么指向内存字节的指针的值(指向变量a,b各个部分字节的指针)还重复了?
62fe3c
62fe38
62fe10 78
62fe11 56
62fe12 34
62fe13 12
62fe10 56
62fe11 34
62fe12 12
62fe13 00
[/i][/i]
本帖最后由 jackz007 于 2019-8-9 23:40 编辑
1. 为了弄清楚问题,首先看看变量是如何传递的,在 main() 中,显示变量 a 的字节内容是通过 show_int(a) 语句实现的; 这是一个典型的传值调用方式,变量 a 的值是通过堆栈传入函数 show_int() 函数的,在这个函数内部,变量 a 事实上已经被另一个局部变量 x 取代,所以, show_bytes() 所显示的变量地址并不是变量 a 或 b 的实际地址,而是 show_int() 函数中的局部变量 x 的地址。
2. 如果去掉注释,显示变量 b 的地址与 a 的完全相同,这个也很好理解,因为它们显示的都是 show_int() 函数中局部变量 x 的内存地址,二者相同也就没什么好值得奇怪的了。
- #include <stdio.h>
- void show_bytes(unsigned char * start , size_t len)
- {
- size_t i ;
- for(i = 0 ; i < len ; i ++) printf("0x%08x : %02x\n" , start + i , start[i]) ;
- printf("\n") ;
- }
- void show_int(int x)
- {
- show_bytes((unsigned char *) & x , sizeof(int)) ; //强制类型转换,&x指向无符号字节
- }
- int main()
- {
- int a = 0x01234567 ;
- int b = 0x89ABCDEF ;
- int * p = & a ;
- int * q = & b ;
- printf("\n") ;
- printf("0x%08x \n" , p) ;
- printf("0x%08x \n" , q) ;
- printf("\n") ;
- show_int(a) ;
- show_int(b) ;
- }
复制代码
|
|