0

根据字节填充,在 32 位操作系统中,当计算机的字大小为 4 字节(一个字节表示 8 位)时,CPU 可以按此处给出的 4 的倍数寻址内存,要读取的数据应该位于内存偏移量是 4 的某个倍数。如果不是这种情况,例如数据从第 14 个字节而不是第 16 个字节开始,则计算机必须读取两个 4 字节块并在读取请求的数据之前进行一些计算,否则可能会产生对齐错误。即使前一个数据结构在第 14 个字节结束,下一个数据结构也应该从第 16 个字节开始。在两个数据结构之间插入两个填充字节,以将下一个数据结构与第 16 个字节对齐。

#include<stdio.h>
struct test {
        char a;
        char b;
        int c;
        int d;
};
void main() {
        int a,b;
        char c,d;
        printf("Address of a & b = %u & %u respectively\n",&a,&b);
        printf("Address of c & d = %u & %u respectively\n",&c,&d);      
        struct test t1;
        printf("The size of structure:::%d\n",sizeof(t1));
}

输出是:

Address of a & b = 3216087804 & 3216087808 respectively
Address of c & d = 3216087802 & 3216087803 respectively
The size of structure:::12

当我以这种方式声明结构时:

struct test {
        char a;
        int b;
        int c;
        char d;
};

在这种情况下输出:

The size of structure:::16

为什么当我们尝试访问内存中奇数位置的 secord char 变量或地址为 4 的倍数时不存在的变量时不会发生对齐错误?

4

1 回答 1

0

在这两种情况下都进行了填充。在您提供的代码中,char b不需要填充,因此不需要填充。int c需要两个字节的填充(我假设典型的 x86 规则)并得到它。结构的总大小为 10 字节数据 + 2 字节填充,用于指示的 12 字节。

在单独的情况下,int b需要三个字节的填充,整个结构需要另外三个字节来放置char a一个 4 字节的边界地址。10 字节的数据 + 3 + 3 字节的填充得到 16 字节。

于 2013-01-09T19:20:25.350 回答