C中的字节对齐、指针结构体的内存空间

李小嘉 发布于 2015/11/13 12:52
阅读 414
收藏 0
#include <stdio.h>


int main(void)
{
#pragma pack(2)
typedef struct{
unsigned long index;
char name[9];
char *attr[4];
}tSA, *ptSA;


#pragma pack()
tSA sa[5];
ptSA psa1 = sa, psa2 = &sa[4];
unsigned long i = (unsigned long)psa1;
unsigned long j = (unsigned long)psa2;


printf("%d\t%ld\n", psa2-psa1, j-i);
}
问分别输出什么?求详细解答
加载中
1
jQer
jQer


权威解答:

`unsigned long` 这个类型,不同的平台不同的编译器其大小都不同。以 Linux 64 位的 8 字节举例(指针大小也是 8 字节):

1. `tSA` 这个结构体的字段对齐尺寸依次为:
   
   * 起始地址 -- 设归 0
   * `unsigned long` -- 8 字节
   * `char` -- 1 字节 × 9 = 9 字节 --> 比 `char *` 小,填充 7 字节对齐 `char *`
   * `char *` -- 8 字节 × 4 = 32 字节

    因此总计大小 8 + (9 + 7) + 32 = 56 字节

2. `sa` 表示在内存中连续存储 5 段 `tSA` 结构体,`psa1` 表示 `sa` 的第 0 号地址,`psa2` 表示 `sa` 的第 4 号地址。

    psa2-psa1 = 指针偏移量 4
    j-i = 指针地址差 = 4 个 tSA 结构体大小 = 4 × 56 = 224 。


yuuyuu
yuuyuu
看清楚,#pragma pack(2)设定边界对齐为2。
jobell
jobell
正解
0
yuuyuu
yuuyuu

1.#pragma pack(2)设定边界对齐为2。char name[9]占9个字节,要加上一个字节,以2对齐占10个。还有,如果是32位机器,unsigned long是4字节,char *attr[4]占4 * 4 = 16字节。64位:tSA结构体内存布局:8 + 9 + 1 + 32 = 50,32位:tSA结构体内存布局:4 + 9 + 1 + 16 = 30。

2.psa2-psa1 = 4;64位:j - i = 4 * 50 = 200,32位:j - i = 4 * 30 = 120。

李小嘉
李小嘉
66666
0
李小嘉
李小嘉

#pragma pack(2)

这里说明了,2字节对齐,所以char name[9]--->应该是10个字节吧!然后我再32位系统中的结果是4和120,;我对指针偏移量和指针地址差的概念不是和了解所以不明吧是第一个输出是4;总之谢谢您

返回顶部
顶部