1、简单地声明一个结构体和定义结构体变量( 三 )


2)如果内部定义并申明了其他结构体变量 , 这时需要把这个结构体看成一个整体 , 大小要独立计算 , 至于对齐数取其内部最大成员的对齐数 。
struct t{char a;//对齐数1struct s //对齐数4{int c; //对齐数4char d;//对齐数1}g;//此处定义并申明了结构体变量 , 在这里需要把结构体//看成一个整体 , 独立计算这个结构体的大小为8字节//结构体整体的对齐数是内部最大成员的对齐数//之后把这个结构体看出对齐数为4 , 大小为8的成员char f; //对齐数1int b;//对齐数4}; //所以该结构体的大小为1+3(补)+8+1+3(补)+4=20个字节
5. 成员包含联合体的结构体
联合体的大小等同于联合体里面最大成员的大小 , 所以可以把联合体等效成一个变量 , 这个变量就是联合体里面最大的那个成员 。
和前文所说的结构体一样 , 如果只声明联合体 , 没定义联合体变量 , 则联合体就当成不存在 。
struct t{char a;union s{int c;char d;double h;}g; int f;double b;};//所以该结构体的大小为1+7(补)+8+4+4(补)+8=32个字节
6. 空结构体的大小
1)在下测试
2)在下测试
六. 柔性数组 1. 介绍
在 c99 中有明确的规定允许结构体中最后一个数组大小是未知的 。
struct T{int a;char b;int arr[];//或者int arr[0];};int main(){struct T t;// sizeof 求结构体大小时所求出的大小没有包括柔性数组的大小printf("%lu\n", sizeof(struct T));return 0;}--------结果如下--------8
2. 使用方法
包含柔性数组的结构体 , 可以把整个结构体看成是变长的 。
#include#include#includestruct d{int nb;int nn;int arr[];};int main(){//分别给结构体中其他类型的成员和柔性数组申请空间struct d *p=(struct d*)malloc(sizeof(struct d)+5*sizeof(int));p->nb=100;p->nn=50;for(int i=0;i<5;i++){p->arr[i]=i;//赋值printf("%d ",p->arr[i]);}//重新调整所申请的空间 , 将柔性数组调整为40 。struct d *pp=(struct d*)realloc(p,48); if(pp!=NULL){p=pp;for(int i=5;i<10;i++){p->arr[i]=i;//赋值printf("%d ",p->arr[i]);} free(p);p=NULL;}return 0;}--------结果如下--------0 1 2 3 4 5 6 7 8 9
3. 柔性数组的特点 柔性数组只需在创建时要独立于结构体申请空间 , 此后的再分配空间和 free 释放都只需对一个结构体指针操作即可 。柔性数组申请的内存更加集中 , 有利于查找使用和减少内存碎片 。求结构体大小时所求出的大小没有包括柔性数组的大小 。七. C++ 中与 class 的区别八. C 和 C++ 结构体的区别 C++ 结构体内部可以有成员变量和成员函数 , 而 C 中结构体只能有成员变量 。C 结构体的成员变量不能在声明时给初值 , 而 C++ 中可以
【1、简单地声明一个结构体和定义结构体变量】C++ 中定义结构变量时 , 可以不在名称前面加上关键字 , 而 C 一定要C 结构体内不能有静态成员 , 而 C++ 可以 。C 结构没有访问修饰限定符 , 而 C++ 有 。