这是一个面试问题.直到现在,我曾经认为这些问题纯粹依赖于编译器,不应该担心我,但现在,我对它很好奇.
假设您有两种结构:
struct A {
int* a;
char b;
}
Run Code Online (Sandbox Code Playgroud)
而且,
struct B {
char a;
int* b;
}
Run Code Online (Sandbox Code Playgroud)
那么你更喜欢哪一个?为什么?我的回答是这样的(虽然我有点在黑暗中拍摄)第一个结构应该是首选的,因为编译器为字大小的一些倍数(这是指针的大小 - 在32上的4个字节)分配结构的空间位机和64位的8字节).因此,对于这两种结构,编译器将分配8个字节(假设它是32位机器).但是,在第一种情况下,填充将在所有变量之后(即在a和b之后)完成.因此,即使有一些机会,b得到一些溢出的值并破坏我的下一个填充字节,但我的a仍然是安全的.
他似乎并不高兴,并要求第一个结构在第二个结构上的一个缺点.我没有太多话要说.:d
请帮我解答.
例如,有一种结构
struct A
{
char a;
int i;
};
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们有[1字节] +填充[3字节] + int [4字节] = 8.
现在让我们对上面的struct进行一些更新,
struct A
{
int i;
char a;
};
Run Code Online (Sandbox Code Playgroud)
在这种情况下,char来自int并且不需要添加填充字节,这意味着sizeof(A)= 5字节,但在这种情况下我也得到8字节的结果.为什么?
好的,这个案子呢
struct s
{
int b;
double c;
char a;
};
Run Code Online (Sandbox Code Playgroud)
根据下面给出的逻辑,有一个:size = b[4 bytes] + padding[4 bytes] + c[8] + a[1] + padding[7 bytes to align with double] = 24,但执行后我得到16.这怎么可能?
首先,我理解结构中的字节填充.但我仍然有一个小测试包含struct中的双字段,我不知道如何解释这个:
typedef struct {
char a;
double b;
}data;
typedef struct{
char a;
int b;
}single;
int main(){
printf("%d\n",sizeof(double));
printf("%d\n",sizeof(single));
printf("%d\n",sizeof(data));
}
Run Code Online (Sandbox Code Playgroud)
通过这个测试,答案是:8 8和16.
为什么这个结果会让我思考?
通过第二次测试,我们可以看到我机器上的单词大小是4个字节.
通过第一次测试,我们可以看到double的大小是8个字节.
所以,在struct data:结果应该是12个字节:char为4个字节,double为8个字节.
但是,我不知道为什么结果是16个字节.(跟我这么奇怪)
请为我解释一下,谢谢:)
我char在结构中只声明了类型成员.
#include <stdio.h>
struct st
{
char c1;
char c2;
char c3;
char c4;
char c5;
};
int main() {
struct st s;
printf("%zu\n", sizeof(s));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出: [ 现场演示 ]
5
Run Code Online (Sandbox Code Playgroud)
那么,为什么结构中只有char类型成员没有填充?