鱼C论坛

 找回密码
 立即注册
查看: 1721|回复: 10

[已解决]结构体对齐

[复制链接]
发表于 2020-1-4 20:34:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这个结构体为什么大小是32字节
struct Person
{
    char name[15];
    int monney;
    int num;
    int account;
    char *recipient[];
};

最后一个成员变量是变长数组,不占空间,第一个成员变量占15字节,中间三个int变量每个是四个字节,那么怎么内存对齐呢
最佳答案
2020-1-4 22:29:44
本帖最后由 jackz007 于 2020-1-4 22:35 编辑
  1.     char *recipient[];
复制代码

        作为 32 位的程序,这个指针也要占用 4 个字节。这个结构体占用的可数的内存是 31 个字节,最后占用了 32 个字节,有可能是 4 、16、32 字节边界对齐。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-1-4 21:07:54 | 显示全部楼层
本帖最后由 人造人 于 2020-1-4 21:12 编辑
  1. #include <stdio.h>

  2. struct Person
  3. {
  4.         char name[15];
  5.         int monney;
  6.         int num;
  7.         int account;
  8.         char *recipient[];
  9. };

  10. int main(void)
  11. {
  12.         printf("%d\n", sizeof(struct Person));
  13.         return 0;
  14. }

  15. /*
  16. 28
  17. 请按任意键继续. . .
  18. */
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-4 21:20:37 | 显示全部楼层
我觉得这是环境相关的,
Dev-C下是32,加上“#pragma pack(4)”后变成了28,
vs下的结果直接就是是28
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-4 22:29:44 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-1-4 22:35 编辑
  1.     char *recipient[];
复制代码

        作为 32 位的程序,这个指针也要占用 4 个字节。这个结构体占用的可数的内存是 31 个字节,最后占用了 32 个字节,有可能是 4 、16、32 字节边界对齐。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-4 22:35:33 | 显示全部楼层
jackz007 发表于 2020-1-4 22:29
作为32位的程序,这个指针也要占用 4 个字节。

加上4确实是刚刚好,但是我定义的这个数组是空,数组名不占空间啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-4 23:08:57 From FishC Mobile | 显示全部楼层
本帖最后由 jackz007 于 2020-1-4 23:15 编辑
苏维埃码农 发表于 2020-1-4 22:35
加上4确实是刚刚好,但是我定义的这个数组是空,数组名不占空间啊


        只有 const 型的常量才有可能不占用内存空间,编译程序可以按类似宏的方式来处理,但凡是变量,都会占用内存,当然,指针型变量也不例外。我想告诉你的是,这一点不容怀疑,只有完全接受这个观点才是正确的!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-5 00:06:30 | 显示全部楼层
jackz007 发表于 2020-1-4 23:08
只有 const 型的常量才有可能不占用内存空间,编译程序可以按类似宏的方式来处理,但凡是变量 ...

老哥,结构体内部的变长数组了解一下。。这玩意真是不占内存的
https://blog.csdn.net/houzijushi/article/details/80245894
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-7 19:30:45 | 显示全部楼层

为什么你是28字节?难道跟编译器有关。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-7 20:54:33 | 显示全部楼层
苏维埃码农 发表于 2020-1-7 19:30
为什么你是28字节?难道跟编译器有关。。。

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-8 13:11:05 | 显示全部楼层
jackz007 发表于 2020-1-4 22:29
作为 32 位的程序,这个指针也要占用 4 个字节。这个结构体占用的可数的内存是 31 个字节,最后 ...

我又确认了下,如果是char recipient[],就不占空间,如果是指针就占四个字节
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-8 13:47:42 | 显示全部楼层
苏维埃码农 发表于 2020-1-8 13:11
我又确认了下,如果是char recipient[],就不占空间,如果是指针就占四个字节

他说错了而且你也确认错了:
  1. struct Person
  2. {
  3.     char name[15];
  4.     int money;
  5.     int num;
  6.     int account;
  7.     char *recipient[];
  8. };


  9. int main(){
  10.         struct Person p;
  11.         void* base=&p;
  12.         void* pmember[]={p.name,&p.money,&p.num,&p.account,&p.recipient};
  13.         printf("sizeof(Person)=%d\n",sizeof(p));
  14.         for (int i=0;i<5;++i){
  15.                 printf("offset[%d]=%d\n",i,pmember[i]-base);
  16.         }
  17. }
复制代码


输出
  1. sizeof(Person)=32
  2. offset[0]=0
  3. offset[1]=16
  4. offset[2]=20
  5. offset[3]=24
  6. offset[4]=32
复制代码


recipient的偏移量是32,结构体占用空间大小也是32,这个变长指针占用的空间只能为0

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-15 11:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表