摘要: 经常被计算结构体的sizeof给搞晕,于是找了个时间,静下心来,搞定它. 一.为什么结构体计算这么乱? 答案是字节对齐,计算机存储系统中以Byte为单位存储数据,不同数据类型所占的空间不同,如:整型(int)数据占4个字节,字符型(char)数据占一个字 节, 短整型(short)数据占两个字节,等等.计算机为了快速的读写数据,默认情况下将数据存放在某个地址的起始位置,如:整型数据(int)默认存储 在地址能被 4整除的起始位置,字符型数据(char)可以存放在任何地址位置(被1整除),…
最近的项目在做socket通信报文解析的时候,用到了结构体与字节数组的转换:由于客户端采用C++开发,服务端采用C#开发,所以双方必须保证各自定义结构体成员类型和长度一致才能保证报文解析的正确性,这一点非常重要. 首先是结构体定义,一些基本的数据类型,C#与C++都是可以匹配的: [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = )] public struct Head { public u…
/* C语言零长度数组大小和取值问题 */ #include <stdio.h> #include <stdlib.h> #include <string.h> struct str { int type; ];//零长度的数组 }; struct foo { int type; char *s; }; void test() { printf("str size is [%d] \n", sizeof(struct str)); //打印 4 /*…
在Linux系统里,/usr/include/linux/if_pppox.h里面有这样一个结构: struct pppoe_tag { __u16 tag_type; __u16 tag_len; char tag_data[0]; } __attribute ((packed)); 最后一个成员为可变长的数组,对于TLV(Type-Length-Value)形式的结构,或者其他需要变长度的结构体,用这种方式定义最好.使用起来非常方便,创建时,malloc一段结构体大小加上可变长数据长度的空间…
目录 前景提示 这里的结构体处理的步骤 一.char数组类型的处理 二.char数组指针类型的处理 三.全部代码 1. char数组 2. char数组指针 结语 前景提示 定义一个结构体,结构体中有两个变量,其中一个是char类型的数组,那么,怎么向这个数组中插入数据,打印数据呢? typedef struct SequenceList { // 数组的元素 char element[20]; // 数组的长度 int length; }; 定义一个结构体,结构体中有两个变量,其中一个是cha…
规则1:结构体的对折长度为其基本数据成员的长度的最大值. 规则2:指定边界情况下,结构体的对折长度为自身对折长度和指定对折长度中较小者. 规则3:当行内结构体的基本数据成员的起始地址必须为其长度的整数倍. 规则4:嵌套取对折长度的情况,里层结构体作为一个变量. · 使用伪指令 #pragma pack (n) ,指定n字节对齐. · n的有效值为1.2.4.8.16等,当n=1时,结构体长度为自成员变量长度相加. · 使用伪指令 #pragma pack () ,取消指定. #include <…
1 //结构体案例 2 2 #include<iostream> 3 #include<string> 4 #include<ctime> 5 using namespace std; 6 7 struct Hero 8 { 9 string name; 10 int age; 11 string sex; 12 }; 13 14 void bubbleSort(struct Hero heroArray[] ,int len ) 15 16 { 17 for (int…
Win32平台下的微软C编译器的对齐策略: 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除: 备注:编译器在给结构体开辟空间时,首先找到结构体中最宽的基本数据类型,然后寻找内存地址能被该基本数据类型所整除的位置,作为结构体的首地址.将这个最宽的基本数据类型的大小作为上面介绍的对齐模数. 2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节: 备注:为结构体的一个成员开辟空间之前,编译器首先检查预开辟空间的首地址相…
typedef struct file { ... }FileInfo, *FileP; 上述程序中定义了一个结构体,结构体的名字为file,并且给其指针 取个别名为FileP,所以后续程序中出现FileP就相当于是struct file *…
很多时候,在对结构体进行相应的编码时,时而发现是用点运算符( . ),时而是用箭头运算符( -> ):那么这两者之间的使用有什么区别么? 相同点:两者都是二元操作符,而且右边的操作数都是成员的名称.不同点:点运算符( . )的左边操作数是一个结果为结构的表达式:              箭头运算符( -> )的左边的操作数是一个指向结构体的指针. 例如: typedef struct // 定义一个结构体类型:DATA { ]; // 结构体成员:key ]; // 结构体成员:name i…