为什么结构体本身大小与结构体指针大小不一样
1. 为什么在以下结构体中sizeof(stu)!=sizeof(pstu),sizeof(stu)=12,sizeof(pstu)=4?
struct student
{
char *name;
int score;
char sex;
}stu,*pstu;
2.当我没在上述结构体中加char sex;时,sizeof(stu)=8,加了过后sizeof(stu)=12,为什么不是sizeof(stu)=9?我用的是devc++编译器。
[解决办法]
看一下关于字节对齐的资料就可以理解了
[解决办法]
根据字节对齐原则:结构体的总大小为结构体最宽基本类型成员大小的整数倍
最大是4个字节 所以结构体的大小永远是4的倍数
[解决办法]
?
sizeof(stu)!=sizeof(pstu),sizeof(stu)=12,sizeof(pstu)=4
sizeof(pstu)=4
pstu是指针所以是4
struct student
{
char *name;
int score;
char sex;
}stu,*pstu;
stu所占的内存是4+4+4(char sex),最后一个4是因为字节对齐的原因。
[解决办法]
在一般win32平台下,
sizeof对所有类型的指针都是固定长度, 一般是4字节.
sizeof对结构体就是其实际需要占的字节长度, 同时跟内部字节对齐方式有关.
[解决办法]
指针 里面保存的是地址
4个字节 32bit 足够表示0到4G的虚拟地址空间
程序运行的时候 加载到相应的虚拟地址空间 通过页表 对应相应的内存地址
指针它不是个东西 它就是存的是地址
[解决办法]
#include <stdio.h>
#define field_offset(s,f) (int)(&(((struct s *)(0))->f))
struct AD { int a; char b[13]; double c;};
#pragma pack(push)
#pragma pack(1)
struct A1 { int a; char b[13]; double c;};
#pragma pack(2)
struct A2 { int a; char b[13]; double c;};
#pragma pack(4)
struct A4 { int a; char b[13]; double c;};
#pragma pack(8)
struct A8 { int a; char b[13]; double c;};
#pragma pack(16)
struct A16 { int a; char b[13]; double c;};
#pragma pack(pop)
int main() {
printf("AD.a %d\n",field_offset(AD,a));
printf("AD.b %d\n",field_offset(AD,b));
printf("AD.c %d\n",field_offset(AD,c));
printf("\n");
printf("A1.a %d\n",field_offset(A1,a));
printf("A1.b %d\n",field_offset(A1,b));
printf("A1.c %d\n",field_offset(A1,c));
printf("\n");
printf("A2.a %d\n",field_offset(A2,a));
printf("A2.b %d\n",field_offset(A2,b));
printf("A2.c %d\n",field_offset(A2,c));
printf("\n");
printf("A4.a %d\n",field_offset(A4,a));
printf("A4.b %d\n",field_offset(A4,b));
printf("A4.c %d\n",field_offset(A4,c));
printf("\n");
printf("A8.a %d\n",field_offset(A8,a));
printf("A8.b %d\n",field_offset(A8,b));
printf("A8.c %d\n",field_offset(A8,c));
printf("\n");
printf("A16.a %d\n",field_offset(A16,a));
printf("A16.b %d\n",field_offset(A16,b));
printf("A16.c %d\n",field_offset(A16,c));
printf("\n");
return 0;
}
//AD.a 0
//AD.b 4
//AD.c 24
//
//A1.a 0
//A1.b 4
//A1.c 17
//
//A2.a 0
//A2.b 4
//A2.c 18
//
//A4.a 0
//A4.b 4
//A4.c 20
//
//A8.a 0
//A8.b 4
//A8.c 24
//
//A16.a 0
//A16.b 4
//A16.c 24
//
//
[解决办法]
查看"字节对齐"相关内容和"指针大小"相关内容
[解决办法]
指针变量首先是个变量,是变量就会占内存大小,指针变量的大小与机器相关。
[解决办法]
任何类型的指针变量一般都占4个字节,结构体由于存在边界对齐问题,实际占用内存比真实所需内存大,根据边界对齐要求降序排列结构成员可以最大限度地减少浪费。sizeof返回的值包含了结构中浪费的内存空间。
[解决办法]
自己调试,看变量内存地址吧。
数据一目了然。
[解决办法]
google 字节对齐