我有以下代码:
#include <stdio.h>
#include <stdint.h>
typedef struct E_s {
uint32_t a;
uint32_t b;
uint32_t c;
} E_t;
typedef struct S_s {
uint32_t data_sz;
char data[];
} S_t;
typedef struct F_s {
E_t E;
S_t S;
char data[16];
//} __attribute__((packed)) full_msg_t;
} F_t;
int main(int argc, char* argv[])
{
F_t out;
printf("sizeof(out.data) = %lu\n", sizeof(out.data));
printf("sizeof(out.E) = %lu\n", sizeof(E_t));
printf("sizeof(out.S) = %lu\n", sizeof(S_t));
printf("sizeof(out) = %lu\n", sizeof(F_t));
return EXIT_SUCCESS;
}
当我运行代码时,我看到以下输出:
sizeof(out.data) = 16
sizeof(out.E) = 12
sizeof(out.S) = 4
sizeof(out) = 32
问题:为什么S_t
的大小是4(输出的第三行)?我本来期望它是8(uint32_t
+char[]
)。为什么char[]
的大小没有计入?此外,
out.data
和out.S.data
都指向同一内存位置,这导致我深入挖掘并发现了上述观察结果。任何线索都将非常有帮助。我没有预料到这两个变量会重叠。
sizeof(S_t)
是多少? - Jabberwockysizeof
对于任何给定类型始终返回相同的值,因此它不可能包括数组的大小,因为那不是类型的一部分。 - ikegamiuint32_t + char[]
)",char data[]
不是一个指针。访问data
允许您访问跟随struct S_s
的字节。在这种情况下,out.S.data
只是访问out.data
的另一种方式。 - ikegamisize_t
值的格式(例如sizeof
返回的值)是%zu
,其中z
是长度修饰符,表示size_t
。 - Jonathan Leffler