user-0 提问: 初学者求教，为什么指针有时候占用的是4个字节，有时候占用的又是6个字节

回复:
user: user-1
content: 引用 12 楼 bhfdcn 的回复:[quote=引用 11 楼 zxh707wk 的回复:] [quote=引用 10 楼 bhfdcn 的回复:] [quote=引用 9 楼 zxh707wk 的回复:] 又来了。。。 我用64位gcc编译结果为 64 16   ------------------ (program exited with code: 0) Press return to continue    64位环境下，普通指针大小为8，非静态成员函数指针大小为16[/quote]但64咋来的。。。[/quote] 56+8啊，8字节对齐[/quote]忘了把4换成8了。。。

user: user-2
content: 引用 11 楼 zxh707wk 的回复:[quote=引用 10 楼 bhfdcn 的回复:] [quote=引用 9 楼 zxh707wk 的回复:] 又来了。。。 我用64位gcc编译结果为 64 16   ------------------ (program exited with code: 0) Press return to continue    64位环境下，普通指针大小为8，非静态成员函数指针大小为16[/quote]但64咋来的。。。[/quote] 56+8啊，8字节对齐

user: user-1
content: 引用 10 楼 bhfdcn 的回复:[quote=引用 9 楼 zxh707wk 的回复:] 又来了。。。 我用64位gcc编译结果为 64 16   ------------------ (program exited with code: 0) Press return to continue    64位环境下，普通指针大小为8，非静态成员函数指针大小为16[/quote]但64咋来的。。。

user: user-2
content: 引用 9 楼 zxh707wk 的回复:又来了。。。 我用64位gcc编译结果为 64 16   ------------------ (program exited with code: 0) Press return to continue    64位环境下，普通指针大小为8，非静态成员函数指针大小为16

user: user-1
content: 又来了。。。 我用64位gcc编译结果为 64 16   ------------------ (program exited with code: 0) Press return to continue

user: user-0
content: 引用 7 楼 bhfdcn 的回复:[quote=引用 6 楼 u012461368 的回复:] [quote=引用 5 楼 bhfdcn 的回复:] [quote=引用 3 楼 u012461368 的回复:] [quote=引用 1 楼 bhfdcn 的回复:] 第一个是因为内存对齐的原因，你的32位机器指针大小是4，第二个是因为两个指针 内存对齐？就是也有可能不是6吗？[/quote] 举个简单的例子吧，比如你的代码改成如下：  typedef struct qnode {     char data;     struct qnode * next; }QNode;  然后你在输出sizeof(QNode)，大小为8，因为data之后补齐了3个字节，实际指针还是4个字节，内存布局如下图所示： [/quote] 哦哦，是指结构体运用指针后大小始终保持4的倍数的意思吗？[/quote] 不完全正确，你把指针换成int类型或别的大于1字节的类型也可能引起结构体大小变化，比如： typedef struct qnode {     char data;     int next; }QNode; 大小也为8，再比如： typedef struct qnode {     char data1;     char data2;     int next; }QNode; 的大小也为8，但是你要把data2和next位置换一下，大小就变成12了，如下： typedef struct qnode {     char data1;     int next;     char data2; }QNode; 大小为12。   [/quote] 懂了，thanks

user: user-2
content: 引用 6 楼 u012461368 的回复:[quote=引用 5 楼 bhfdcn 的回复:] [quote=引用 3 楼 u012461368 的回复:] [quote=引用 1 楼 bhfdcn 的回复:] 第一个是因为内存对齐的原因，你的32位机器指针大小是4，第二个是因为两个指针 内存对齐？就是也有可能不是6吗？[/quote] 举个简单的例子吧，比如你的代码改成如下：  typedef struct qnode {     char data;     struct qnode * next; }QNode;  然后你在输出sizeof(QNode)，大小为8，因为data之后补齐了3个字节，实际指针还是4个字节，内存布局如下图所示： [/quote] 哦哦，是指结构体运用指针后大小始终保持4的倍数的意思吗？[/quote] 不完全正确，你把指针换成int类型或别的大于1字节的类型也可能引起结构体大小变化，比如： typedef struct qnode {     char data;     int next; }QNode; 大小也为8，再比如： typedef struct qnode {     char data1;     char data2;     int next; }QNode; 的大小也为8，但是你要把data2和next位置换一下，大小就变成12了，如下： typedef struct qnode {     char data1;     int next;     char data2; }QNode; 大小为12。

user: user-0
content: 引用 5 楼 bhfdcn 的回复:[quote=引用 3 楼 u012461368 的回复:] [quote=引用 1 楼 bhfdcn 的回复:] 第一个是因为内存对齐的原因，你的32位机器指针大小是4，第二个是因为两个指针 内存对齐？就是也有可能不是6吗？[/quote] 举个简单的例子吧，比如你的代码改成如下：  typedef struct qnode {     char data;     struct qnode * next; }QNode;  然后你在输出sizeof(QNode)，大小为8，因为data之后补齐了3个字节，实际指针还是4个字节，内存布局如下图所示： [/quote] 哦哦，是指结构体运用指针后大小始终保持4的倍数的意思吗？

user: user-2
content: 引用 3 楼 u012461368 的回复:[quote=引用 1 楼 bhfdcn 的回复:] 第一个是因为内存对齐的原因，你的32位机器指针大小是4，第二个是因为两个指针 内存对齐？就是也有可能不是6吗？[/quote] 举个简单的例子吧，比如你的代码改成如下：  typedef struct qnode {     char data;     struct qnode * next; }QNode;  然后你在输出sizeof(QNode)，大小为8，因为data之后补齐了3个字节，实际指针还是4个字节，内存布局如下图所示：

user: user-0
content: 引用 2 楼 user-3 的回复:结构体字节对齐，楼主加个这个再测测看。 #pragma pack(1) typedef struct qnode { char data[50]; struct qnode * next; }QNode;  typedef struct { QNode * front; QNode * rear; }LiQueue;  #pragma pack()  第一个变成54了，这是什么原因？能解释一下吗？

user: user-0
content: 引用 1 楼 bhfdcn 的回复:第一个是因为内存对齐的原因，你的32位机器指针大小是4，第二个是因为两个指针 内存对齐？就是也有可能不是6吗？

user: user-3
content: 结构体字节对齐，楼主加个这个再测测看。 #pragma pack(1) typedef struct qnode { char data[50]; struct qnode * next; }QNode;  typedef struct { QNode * front; QNode * rear; }LiQueue;  #pragma pack()

user: user-2
content: 第一个是因为内存对齐的原因，你的32位机器指针大小是4，第二个是因为两个指针