鱼C论坛

 找回密码
 立即注册
查看: 1323|回复: 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 编辑
    char *recipient[];
        作为 32 位的程序,这个指针也要占用 4 个字节。这个结构体占用的可数的内存是 31 个字节,最后占用了 32 个字节,有可能是 4 、16、32 字节边界对齐。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

struct Person
{
        char name[15];
        int monney;
        int num;
        int account;
        char *recipient[];
};

int main(void)
{
        printf("%d\n", sizeof(struct Person));
        return 0;
}

/*
28
请按任意键继续. . .
*/
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2020-1-4 22:29:44 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-1-4 22:35 编辑
    char *recipient[];
        作为 32 位的程序,这个指针也要占用 4 个字节。这个结构体占用的可数的内存是 31 个字节,最后占用了 32 个字节,有可能是 4 、16、32 字节边界对齐。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

加上4确实是刚刚好,但是我定义的这个数组是空,数组名不占空间啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

使用道具 举报

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

老哥,结构体内部的变长数组了解一下。。这玩意真是不占内存的
https://blog.csdn.net/houzijushi/article/details/80245894
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

为什么你是28字节?难道跟编译器有关。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我又确认了下,如果是char recipient[],就不占空间,如果是指针就占四个字节
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

他说错了而且你也确认错了:
struct Person
{
    char name[15];
    int money;
    int num;
    int account;
    char *recipient[];
};


int main(){
        struct Person p;
        void* base=&p;
        void* pmember[]={p.name,&p.money,&p.num,&p.account,&p.recipient};
        printf("sizeof(Person)=%d\n",sizeof(p));
        for (int i=0;i<5;++i){
                printf("offset[%d]=%d\n",i,pmember[i]-base);
        }
}

输出
sizeof(Person)=32
offset[0]=0
offset[1]=16
offset[2]=20
offset[3]=24
offset[4]=32

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 07:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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