苏维埃码农 发表于 2020-1-4 20:34:52

结构体对齐

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

最后一个成员变量是变长数组,不占空间,第一个成员变量占15字节,中间三个int变量每个是四个字节,那么怎么内存对齐呢

人造人 发表于 2020-1-4 21:07:54

本帖最后由 人造人 于 2020-1-4 21:12 编辑

#include <stdio.h>

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

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

/*
28
请按任意键继续. . .
*/

Croper 发表于 2020-1-4 21:20:37

我觉得这是环境相关的,
Dev-C下是32,加上“#pragma pack(4)”后变成了28,
vs下的结果直接就是是28

jackz007 发表于 2020-1-4 22:29:44

本帖最后由 jackz007 于 2020-1-4 22:35 编辑

    char *recipient[];
      作为 32 位的程序,这个指针也要占用 4 个字节。这个结构体占用的可数的内存是 31 个字节,最后占用了 32 个字节,有可能是 4 、16、32 字节边界对齐。

苏维埃码农 发表于 2020-1-4 22:35:33

jackz007 发表于 2020-1-4 22:29
作为32位的程序,这个指针也要占用 4 个字节。

加上4确实是刚刚好,但是我定义的这个数组是空,数组名不占空间啊

jackz007 发表于 2020-1-4 23:08:57

本帖最后由 jackz007 于 2020-1-4 23:15 编辑

苏维埃码农 发表于 2020-1-4 22:35
加上4确实是刚刚好,但是我定义的这个数组是空,数组名不占空间啊

      只有 const 型的常量才有可能不占用内存空间,编译程序可以按类似宏的方式来处理,但凡是变量,都会占用内存,当然,指针型变量也不例外。我想告诉你的是,这一点不容怀疑,只有完全接受这个观点才是正确的!

Croper 发表于 2020-1-5 00:06:30

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

老哥,结构体内部的变长数组了解一下。。这玩意真是不占内存的
https://blog.csdn.net/houzijushi/article/details/80245894

苏维埃码农 发表于 2020-1-7 19:30:45

人造人 发表于 2020-1-4 21:07


为什么你是28字节?难道跟编译器有关。。。

人造人 发表于 2020-1-7 20:54:33

苏维埃码农 发表于 2020-1-7 19:30
为什么你是28字节?难道跟编译器有关。。。

苏维埃码农 发表于 2020-1-8 13:11:05

jackz007 发表于 2020-1-4 22:29
作为 32 位的程序,这个指针也要占用 4 个字节。这个结构体占用的可数的内存是 31 个字节,最后 ...

我又确认了下,如果是char recipient[],就不占空间,如果是指针就占四个字节

Croper 发表于 2020-1-8 13:47:42

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

他说错了而且你也确认错了:struct Person
{
    char name;
    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-base);
        }
}

输出sizeof(Person)=32
offset=0
offset=16
offset=20
offset=24
offset=32

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

页: [1]
查看完整版本: 结构体对齐