gpt4 book ai didi

c - 每个字段的偏移量和下面结构体声明的大小

转载 作者:行者123 更新时间:2023-12-02 02:55:11 25 4
gpt4 key购买 nike

A. struct P1 {short i; int c; int *j; short *d;};
D. struct P4 {char w[16]; int *c[2]};
E. struct P5 {struct P4 a[2]; struct P1 t};
答案说P1的总大小是16个字节。但我认为 short 需要 4(插入 2 个字节以满足对齐要求),int 需要 4,两个指针 *j 和 *d 各需要 8。所以总大小应该是 4 + 4 + 8 + 8 = 24。我做弄错了吗?另外,对于E.P5,t的offset是24,不知道是怎么来的。 a[2] 是一个包含两个元素的数组。每个元素都是一个 P4 结构。既然 P4 的大小是 32,那么 a[2] 不应该占用 64 个字节吗?

最佳答案

The offset of each field and the size of the following structure declarations



有许多影响结果的填充、对齐和整数大小问题。最好使用标准代码来报告偏移值和大小。

So the total size should be 4 + 4 + 8 + 8 = 24. Do I get it wrong?



合理的计算,但不是确定的。大小取决于对齐、编译器和平台的填充。即使对于已知的体系结构,结果也可能因编译器及其选项而异。

Since the size of P4 is 32, shouldn't a[2] take 64 bytes?



与前面的问题一样,有许多考虑因素在起作用。

struct 中查找成员的偏移量, 使用 offsetof()
查找 struct 的大小, 使用 sizeof() .

要打印这些值,请使用正确匹配的打印说明符: "%zu"
使用正确的语法。查看 ; 的使用情况在 P4P5 .
struct P1 {
short i;
int c;
int *j;
short *d;
};

struct P4 {
char w[16];
int *c[2];
};

struct P5 {
struct P4 a[2];
struct P1 t;
};

#include <stdio.h>
#include <stdlib.h>

int main(void) {
printf("PI i:%zu\n", offsetof(struct P1, i));
printf("PI c:%zu\n", offsetof(struct P1, c));
printf("PI j:%zu\n", offsetof(struct P1, j));
printf("PI d:%zu\n", offsetof(struct P1, d));
printf("PI size:%zu\n\n", sizeof(struct P1));

printf("P4 w:%zu\n", offsetof(struct P4, w));
printf("P4 c:%zu\n", offsetof(struct P4, c));
printf("P4 size:%zu\n\n", sizeof(struct P4));

printf("P5 a:%zu\n", offsetof(struct P5, a));
printf("P5 t:%zu\n", offsetof(struct P5, t));
printf("P5 size:%zu\n\n", sizeof(struct P5));
}

输出:您的输出可能会有所不同。
PI i:0
PI c:4
PI j:8
PI d:12
PI size:16

P4 w:0
P4 c:16
P4 size:24

P5 a:0
P5 t:48
P5 size:64

关于c - 每个字段的偏移量和下面结构体声明的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49848975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com