一个。 <img src="actual_image_src" alt="helloworld" onerror="doSomething(this)" />
d。 struct P1 {short i; int c; int *j; short *d;};
电子。 struct P4 {char w[16]; int *c[2]};
答案说P1的总大小是16个字节。但我认为短路需要4个(插入2个字节以满足对齐要求),int需要4个,两个指针* j和* d每个需要8个。所以总大小应该是4 + 4 + 8 + 8 = 24。搞错了?此外,对于E. P5,t的偏移是24.我不知道它是怎么来的。 a [2]是一个包含两个元素的数组。每个元素都是P4结构。既然P4的大小是32,那么[2]不应该占用64个字节?
答案 0 :(得分:1)
每个字段的偏移量和以下结构声明的大小
有许多填充,对齐和整数大小的问题会影响结果。最好使用标准代码报告偏移值和大小。
所以总大小应该是4 + 4 + 8 + 8 = 24.我弄错了吗?
合理的计算,但不是确定的。大小取决于编译器和平台的对齐,填充。即使对于已知的体系结构,结果也可能因编译器及其选项而异。
由于P4的大小是32,不应该[a]需要64个字节吗?
与先前的问题一样,许多考虑因素都在发挥作用。
要查找struct
中成员的偏移量,请使用offsetof()
要查找struct
的尺寸,请使用sizeof()
。
要打印这些值,请使用正确匹配的打印说明符:"%zu"
使用正确的语法。查看;
和P4
中P5
的使用情况。
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
答案 1 :(得分:0)
找到解决方案的简单方法是:编写代码并运行它。
#include <stdio.h>
typedef struct P1 {
short i;
int c;
int* j;
short* d;
} P1_t;
typedef struct P2 {
char w[16];
int* c[2];
} P4_t;
typedef struct P5 {
P4_t a[2];
P1_t t;
} P5_t;
int main() {
P1_t a;
P4_t b;
P5_t c;
printf("%d %d %d\n", sizeof(a), sizeof(b), sizeof(c));
return 0;
}
但是,由于基本类型和指针(如int
和short*
)未链接到特定大小,因此结果可能因平台而异。我在Linux子系统Linux上运行它,我的输出是:
$ 24 32 88