use*_*755 1 c memory pointers kernel memory-management
这是我有一个非常基本的内存地址问题:
这是我的片段:
int *i = &a[0];
printf("ptr i = %p, i = %x, (i+1) = %p, (i+1) = %x\n", i, i, i+1, i+1);
Run Code Online (Sandbox Code Playgroud)
输出如下:
ptr i = 0x7fff5fbff700, i = 5fbff700, (i+1) = 0x7fff5fbff704, (i+1) = 5fbff704
这是一个32位内核.
我真正没有得到的是:
地址0x7fff5fbff700和地址0x7fff5fbff704应该相差32位或4字节.
如果我将地址中的每个"元素" 0x7fff5fbff700视为1个字节,那么是的,我可以看到两个地址如何相差4个字节,但如果是这种情况,那么地址0x7fff5fbff704将是12*4 = 48字节.这怎么可能呢??
我在Linux中运行它,这是我得到的:
ptr i = 0xffff82cc, i = ffff82cc, (i+1) = 0xffff82d0, (i+1) = ffff82d0
如果我尝试打印(i + 1)-1,它总是给出0x1
但我不知道0xffff 82cc和0xffff 82d0如何相差32位或4字节!
0xffff82cc = FFFF 1000 0010 1010 1010 0xffff82d0 = FFFF 1000 0010 1011 0000
请解释
这很简单.地址指向内存中的一个字节.将1添加到地址,然后获取内存中下一个字节的地址.
指针知道它们指向的值的大小,因此当你向int*它添加1时,它实际上会增加4所包含的地址(以满足32位(4字节)整数).
0x7fff5fbff700特定字节的地址也是如此(或者在int*32位int 的情况下). 0x7fff5fbff704 = 0x7fff5fbff700 + 4,所以0x7fff5fbff704指向第一个字节后的第4个字节(或下一个32位int).
同样,0xffff82d0 = 0xffff82cc + 4所寻址的位置相隔4个字节(32位).
图表可能会有所帮助.将内存视为一个大的字节列表,每个字节都有自己的地址.因此,一小部分内存看起来像(网格中的每个单元格都是一位,而字节的地址位于右侧):
| |
| |
+-+-+-+-+-+-+-+-+
| | | | | | | | | <- 0x7fff5fbff6ff
+-+-+-+-+-+-+-+-+
| | | | | | | | | <- 0x7fff5fbff700
+-+-+-+-+-+-+-+-+
| | | | | | | | | <- 0x7fff5fbff701
+-+-+-+-+-+-+-+-+
| | | | | | | | | <- 0x7fff5fbff702
+-+-+-+-+-+-+-+-+
| | | | | | | | | <- 0x7fff5fbff703
+-+-+-+-+-+-+-+-+
| | | | | | | | | <- 0x7fff5fbff704
+-+-+-+-+-+-+-+-+
| | | | | | | | | <- 0x7fff5fbff705
+-+-+-+-+-+-+-+-+
| |
| |
Run Code Online (Sandbox Code Playgroud)
因此,在您的代码中int,值为0x7fff5fbff700 的指针指向32位int,它存储在内存位置0x7fff5fbff700,0x7fff5fbff701,0x7fff5fbff702和0x7fff5fbff703中.这是4个字节,总共32位.
当你向指针添加1时,它实际上将地址递增4,因此指针然后存储下一个32位整数(0x7fff5fbff704)的firxt字节的地址.