【发布时间】:2021-08-27 20:54:01
【问题描述】:
我在 C 中有一个结构:
typedef struct {
char member_a;
char member_b;
char member_c;
char member_d;
} mystruct;
据我了解,C 结构将其成员连续存储在内存中。如果我打印出结构的内存,我可以看到是这种情况,但看起来成员的顺序是颠倒的。
mystruct m;
m.member_a = 0xAA;
m.member_b = 0xBB;
m.member_c = 0xCC;
m.member_d = 0xDD;
printf("%X\n", m);
这个输出:
DDCCBBAA
这是因为结构的成员值以相反的顺序存储在内存中吗?
所以内存看起来像这样,如果m 存储在内存位置 0x00 并且每个位置的大小为 1 个字节:
| memory location | value |
|---|---|
| 0x00 | 0xDD |
| 0x01 | 0xCC |
| 0x02 | 0xBB |
| 0x03 | 0xAA |
这总是 C 的情况吗?这个编译器是特定的吗?具体架构?其他的?
在 Mac 上使用 gcc
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 11.0.0 (clang-1100.0.33.17)
Target: x86_64-apple-darwin19.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
【问题讨论】:
-
%X格式说明符需要unsigned int,但您通过了mystruct。这会调用未定义的行为,允许任何事情发生。 -
这个特定结果的原因看起来像你在 little-endian 机器上。
-
更具体地说,它们以 AA BB CC DD 的形式存储在内存中,但在 Little Endian 机器上被视为单个整数时,这意味着 0xDDCCBBAA(例如,最低有效位、小端、首先存储)。如果你按字节循环,你会看到你所期望的。
-
是的,内存是连续的。是的,连续内存空间内的确切布局可能因平台和架构而异。只要您不做出任何无效的假设,就不应该有任何问题或冲突。