位段:
如
struct A{ int _a:2; int _b:5; int _c:10; int _d:30;};
int 是开辟空间的字节数4
:后的数字时变量所占比特位的多少
当第一个开辟空间够用是下一个不会开辟第二个空间
比如本题就只开辟了两个int的空间占8个字节. 32个比特位
位段的内存分配
位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。
联合体:
联合体大小的计算
联合的大小至少是最大成员的大小。
当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
比如
union Un1{ char c[5]; int i;};//大小为8union Un2{ short c[7]; int i;};//大小为16
第一个因为char a[5]是char类型他的对齐数为1 int类型的对齐数为4
原本他们共用同一份空间大小为5
但联合体大小要对齐到最大对齐数的整数倍及4的整数倍8.
第二个同理
short类型的对齐数为2 int类型对齐数为4
原本公用一块内存大小为14(7*2)
但要对齐到最大对齐数的整数倍及4的整数倍还要大于14所以为16
2.动态内存管理
3+1个函数:
申请:malloc、realloc、calloc
释放:free
void *malloc(size_t size),size是申请的空间的大小,单位是字节,返回值是指向申请空间首地址的指针;
void *calloc(size_t num, size_t size),num是所申请类型的数目,size同理
void *realloc(void *p,size _t size),p是申请空间的指针,size同理,如果指针初始化没有空间分配,则realloc作用相当于malloc,如果有,则是重新调整。
重点:所有申请完毕、使用完毕之后,都需要释放,并且把指针置空。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)