struct和union分析

struct
空结构体大小,依据编译器的不同而不同,gcc中为0,且不同的结构体变量地址相同;而在g++中为1,不同的结构体变量地址也不同。没有谁对谁错,现代编译器中认为空结构体大小为1较为合理。

柔性数组
即数组大小待定的数组。
规则:结构中最后一个元素允许是未知大小的数组;
      结构中的柔性数组成员前面必须至少一个其他成员。
typedef struct flex
{
int len;
int array[];
}SoftArray;
array[]0个元素没有占用空间,所以sizeof(SoftArray)=4。
分配内存空间操作如下:
SoftArray* sa = (SoftArray*)malloc(sizeof(SoftArray)+10*sizeof(int));
此时sizeof(*sa)仍为4,柔性数组只是编外人员,不占用结构体的编制。只是说在使用柔性数组时需要把它当成结构体的一个成员而已,仅此而已。

union
只分配最大域的空间,所有域共享这个空间
union维护足够的空间来置放多个数据成员的“一种”,而不是为每个数据成员配置空间,在union中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。
   大端模式(Big_endian):字数据的高字节存储在低地址中,而字数据的低字节则存放 在高地址中。 
   小端模式(Little_endian):字数据的高字节存储在高地址中,而字数据的低字节则存放 在低地址中。 
union 型数据所占的空间等于其最大的成员所占的空间。对union型的成员的存取都是相对于该联合体基地址的偏移量为0处开始,也就是联合体的访问不论对哪个变量的存取都是从union 的首地址位置开始。
union c
{
    int i;;
    char c;
};
union c cc;
cc.i = 1;
printf("%d\n",cc.c);    //若为1,则为小端模式;为0,则为大端模式
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码是在编写语法分析器时使用的。在语法分析器中,需要将输入的源代码转换成一棵语法树,以便进行后续的编译流程。而语法树中的每个节点都对应着源代码中的一个语法结构,比如表达式、语句、函数等等。 在语法分析器中,需要定义一些数据类型来表示语法树中的节点。在这段代码中,使用 `%union` 定义了一个联合体,其中包含了三个成员变量: - `int number`:用于存储整数值; - `char lexeme[100]`:用于存储词素,即词法分析分析出的单词的字符串表示; - `struct ast_node* node`:用于存储语法树节点的指针。 联合体中的三个成员变量可以互相替代,即它们共用一块内存空间,而不是同时存在。这样做的好处是可以节省内存空间。在语法分析器中,根据当前分析到的语法结构不同,可以使用不同的成员变量来存储相应的数据。 举个例子,假设有以下的语法规则: ``` expr : NUMBER | IDENTIFIER | expr ADD expr | expr SUB expr | NOT expr ``` 这个语法规则表示一个表达式可以是一个数字、一个标识符,或者由两个表达式相加、相减、取反而得到。在这个语法规则中,用到了三种不同的数据类型:数字、标识符和语法树节点。 在使用 `%token` 定义终结符号时,可以通过 `<lexeme>` 属性将词法分析器解析出的单词的字符串值传递给语法分析器,以便构造语法树。在上述的语法规则中,如果当前分析到了一个数字或标识符,可以将其存储在 `lexeme` 成员变量中。如果当前分析到了一个表达式,可以将其存储在 `node` 成员变量中。 总之,这段代码主要是为了定义语法树节点的数据类型,以便在语法分析器中进行使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值