结构体对齐
这个结构体为什么大小是32字节struct Person
{
char name;
int monney;
int num;
int account;
char *recipient[];
};
最后一个成员变量是变长数组,不占空间,第一个成员变量占15字节,中间三个int变量每个是四个字节,那么怎么内存对齐呢 本帖最后由 人造人 于 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
请按任意键继续. . .
*/ 我觉得这是环境相关的,
Dev-C下是32,加上“#pragma pack(4)”后变成了28,
vs下的结果直接就是是28 本帖最后由 jackz007 于 2020-1-4 22:35 编辑
char *recipient[];
作为 32 位的程序,这个指针也要占用 4 个字节。这个结构体占用的可数的内存是 31 个字节,最后占用了 32 个字节,有可能是 4 、16、32 字节边界对齐。 jackz007 发表于 2020-1-4 22:29
作为32位的程序,这个指针也要占用 4 个字节。
加上4确实是刚刚好,但是我定义的这个数组是空,数组名不占空间啊 本帖最后由 jackz007 于 2020-1-4 23:15 编辑
苏维埃码农 发表于 2020-1-4 22:35
加上4确实是刚刚好,但是我定义的这个数组是空,数组名不占空间啊
只有 const 型的常量才有可能不占用内存空间,编译程序可以按类似宏的方式来处理,但凡是变量,都会占用内存,当然,指针型变量也不例外。我想告诉你的是,这一点不容怀疑,只有完全接受这个观点才是正确的! jackz007 发表于 2020-1-4 23:08
只有 const 型的常量才有可能不占用内存空间,编译程序可以按类似宏的方式来处理,但凡是变量 ...
老哥,结构体内部的变长数组了解一下。。这玩意真是不占内存的
https://blog.csdn.net/houzijushi/article/details/80245894 人造人 发表于 2020-1-4 21:07
为什么你是28字节?难道跟编译器有关。。。 苏维埃码农 发表于 2020-1-7 19:30
为什么你是28字节?难道跟编译器有关。。。
嗯 jackz007 发表于 2020-1-4 22:29
作为 32 位的程序,这个指针也要占用 4 个字节。这个结构体占用的可数的内存是 31 个字节,最后 ...
我又确认了下,如果是char recipient[],就不占空间,如果是指针就占四个字节 苏维埃码农 发表于 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]