C 强制转换指针地址偏移量不同
我已经编写了一段代码来确定系统的字节顺序。但是输出让我困惑C 强制转换指针地址偏移量不同,c,endianness,C,Endianness,我已经编写了一段代码来确定系统的字节顺序。但是输出让我困惑 ... int a = 0x12345678; uint8_t c0, c1, c2, c3; c0 = *( (uint8_t *)&a ); c1 = *( (uint8_t *)&a+1 ); c2 = *( (uint8_t *)&a+2 ); c3 = *( (uint8_t *)&a+3 ); /* Print addresses
...
int a = 0x12345678;
uint8_t c0, c1, c2, c3;
c0 = *( (uint8_t *)&a );
c1 = *( (uint8_t *)&a+1 );
c2 = *( (uint8_t *)&a+2 );
c3 = *( (uint8_t *)&a+3 );
/* Print addresses of all the variables. */
...
输出:
&a : 0xbf9b23f8
&c0: 0xbf9b23fc // &c0 - &a = 4, Why &a != &c0 ?
&c1: 0xbf9b23fd
&c2: 0xbf9b23fe
&c3: 0xbf9b23ff
如果我对一些语句进行注释,偏移量将有所不同
...
int a = 0x12345678;
uint8_t c0;
c0 = *( (uint8_t *)&a );
...
输出:
&a : 0xbf893788
&c0: 0xbf89378f // &c0 - &a = 7 ??
我可以建议一个更简单的方法吗
int a=0x01234567;
unsigned char *c;
c = (unsigned char*)(&a);
for(int i=0; i<4; i++) {
printf("byte %d = %02x\n", i, c[i]);
}
inta=0x01234567;
无符号字符*c;
c=(无符号字符*)(&a);
对于(inti=0;i,只修改了源代码中的一些内容
#include <stdio.h>
#include <stdint.h> // for uint8_t
#include <stdlib.h>
int main(void)
{
int a = 0x12345678;
uint8_t *c0, *c1, *c2, *c3; // Changed to pointers
c0 = (uint8_t *)&a; //address is stored
c1 = (uint8_t *)&a+1;
c2 = (uint8_t *)&a+2;
c3 = (uint8_t *)&a+3;
printf("&a : %p\n", (void *)&a );
printf("&c0: %p\n", (void *)c0);
printf("&c1: %p\n", (void *)c1);
printf("&c2: %p\n", (void *)c2);
printf("&c3: %p\n", (void *)c3);
exit(0);
}
您正在打印变量的地址。为什么希望某个地址发生更改?它包含从另一个变量的部分地址复制的数据,但c0到c3的地址与您使用它们的算法之间没有关系(打印a
字节/字节的地址)
&c0-&a=4,为什么&a!=&c0
因为它们是不同的变量
如果我对一些语句进行注释,偏移量将有所不同
编译器可以随意分配堆栈上的对象。您无法事先知道如何或在堆栈上分配变量。编译器很可能会尝试在堆栈框架中正确对齐您的变量。将除变量声明之外的所有代码刮走。现在再次问您的问题。“为什么&a!=&c0"那因为它们是不同的变量呢?你应该看看c0..c3
的值,而不是地址。@WhozCraig是的。我已经打印了它们的值,结果是正确的。两个不同的变量怎么可能在内存中的同一个位置?@Wisatbff为什么&a!=&c0?我不明白你为什么期待地址a等于c0。你声明了两个显然占用不同内存地址的变量。@Anand啊..我太笨了。除了你不再打印&c0等等,你正在打印指针变量的内容。
&a : 0022FF34
&c0: 0022FF34
&c1: 0022FF35
&c2: 0022FF36
&c3: 0022FF37