方式一:定义结构体变量或者结构体指针
一般情况下,如果想知道结构体成员的内存占用情况需要先用结构体在内存中开空间,然后再使用sizeof(结构体变量.成员名)或者sizeof(结构体指针->成员名)的形式获取成员在内存中所占空间大小,举例如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
int id;
char ch;
}data;
int main()
{
data a; // 结构体变量
data *p = (data *)malloc(sizeof(data));
// 结构体变量用点语法
printf("方式一:成员id大小:%d,ch大小:%d\n",
sizeof(a.id),sizeof(a.ch));
// 结构体指针用 ->
printf("方式二:成员id大小:%d,ch大小:%d\n",
sizeof(p->id),sizeof(p->ch));
return 0;
}
此方法需要在内存中开辟空间。
方式二:不开辟空间直接获取
在阅读源码的时候偶然发现了一种非常妙的写法:可以将结构体指针强制指向地址为0的区域,然后直接用sizeof访问成员。
printf("方法三:成员id大小:%d,ch大小:%d\n",
sizeof(((data *)0)->id),sizeof(((data *)0)->ch));
地址为0的区域为保留区,程序运行时并不会真正在内存中开空间,这里可以理解为借用了0值。
为了通用,可以讲这种方法进行宏定义:
#define size_of_attribute(Struct, Attribute) sizeof(((Struct*)0)->Attribute)
Struct --- 结构体类型名字
Attribute --- 结构体成员名
测试代码如下,你也快去试一下吧!
#include<stdio.h>
#include<stdlib.h>
#define size_of_attribute(Struct, Attribute) sizeof(((Struct*)0)->Attribute)
typedef struct
{
int id;
char ch;
}data;
typedef struct
{
double d;
short m;
}data2;
int main()
{
printf("%d\n",size_of_attribute(data,ch));
printf("%d\n",size_of_attribute(data2,d));
return 0;
}