C 结构的原始输出

C 结构的原始输出,c,memory,struct,C,Memory,Struct,我有一个下面类型的简单C程序 #include<stdio.h> struct test{ char a; char b; char c; char d; int e; }; void main() { struct test mem = {0xa, 0xb, 0xc, 0xd, 0xef12}; long int *tmp = (long int *)(&mem.a); printf("Struct in binary %p : 0x%lx\n",

我有一个下面类型的简单C程序

#include<stdio.h>
struct test{
char a;
char b;
char c;
char d;
int e;
};

void main() {
    struct test mem = {0xa, 0xb, 0xc, 0xd, 0xef12};
    long int *tmp = (long int *)(&mem.a);
    printf("Struct in binary %p : 0x%lx\n", &mem.a, *tmp);
    printf("Printing only a member %p : 0x%x\n", &(mem.e), *(int *)(&(mem.e)));

}
#包括
结构测试{
字符a;
字符b;
字符c;
chard;
INTE;
};
void main(){
结构测试mem={0xa,0xb,0xc,0xd,0xef12};
长整型*tmp=(长整型*)(&mem.a);
printf(“二进制结构%p:0x%lx\n”,&mem.a,*tmp);
printf(“仅打印成员%p:0x%x\n”,&(mem.e),*(int*)(&(mem.e));
}
上述程序在Big-endian机器上的输出如下:

二进制0x7ffc1206abc0中的结构:0xef120d0c0b0a

仅打印成员0x7ffc1206abc4:0xef12

问题是,为什么结构的原始输出与其成员值的顺序相反


“成员e”的地址距离结构基址的开头仍有4个字节

我相信你不明白,
long int
本身就是big-endian。因此,使用
long int
对结构进行别名将以相反的顺序打印内存内容。仅打印成员的文本
来自何处?你能编辑你的问题并清除程序输出,将其放入代码格式中吗?这台机器是一台大端机。你能详细解释一下“long int本身就是big endian”是什么意思吗?使用
*(long int*)内存
将以
long int
访问内存的方式访问内存-在big endian中。要打印字节,请将内存别名为
char
,并对字节进行迭代和通过
*tmp
获取
长int
值是一种错误,如果生成的地址没有正确对齐,还可能导致未定义的行为和程序失败。为什么您确定您的计算机是big-endian?我不这么认为。我在一台小小的endian机器上尝试了你的代码,它给出了与我预期的相同的输出。