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