结构体类型

零基础入门之结构体字节对齐

会有一股神秘感。 提交于 2019-12-04 08:32:59
一、字节对齐的规则: 1、一般设置的对齐方式为1,2,4字节对齐方式。结构的首地址必须是结构内最宽类型的整数倍地址;另外,结构体的每一个成员起始地址必须是自身类型大小的整数倍(需要特别注意的是windows下是这样的,但在linux的gcc编译器下最高为4字节对齐),否则在前一类型后补0;这里特别提到的是数组一定要注意,而且在一些编程的技巧中,我们可以使用数组强制字节达到对齐的目的。这在网络编程中是很常见的。 举例:比如CHAR型占用空间为1字节,则其起始位置必须可被1整除。INT为4字节,其起始位置必须被4带队,依次类推。(我们假定类或结构体的起始位置为0位置,其实编译器是在开辟空间时,会寻找起始位置可被结构内最宽类型整除的地址做为开始地址,因此我们可以假定其为0值,因为这0值可以被任意的类型整除。) 2、结构体的整体大小必须可被对齐值整除,默认4(结构中的类型大小都小于默认的4)。 3、结构体的整体大小必须可被本结构内的最宽类型整除。(其实和上一条是一样的,但这里独立出来,起注意作用。比如结构体里的有DOUBLE,那么结构的大小最后必须可被8整除) 注意:GCC不是这样,就是最高只能被4整除。此为32位系统,64为系统也会采用8整除的方式。否则(2、3条),编译器会在结构的最后添充一定的特定字符来补齐。 struct T { char ch; double d ; };

Golang的json包

随声附和 提交于 2019-12-04 04:18:46
encoding/json encoding/json 是官方提供的标准json, 实现 RFC 7159中 定义的JSON编码和解码。使用的时候需要预定义 struct ,原理是通过 reflection 和 interface 来完成工作, 性能低。 常用的接口: func Marshal(v interface{}) ([]byte, error) 生成JSON func Unmarshal(data []byte, v interface{}) error 解析JSON到 struct 示例1 生成JSON: type ColorGroup struct { ID int Name string Colors []string } group := ColorGroup{ ID: 1, Name: "Reds", Colors: []string{"Crimson", "Red", "Ruby", "Maroon"}, } b, err := json.Marshal(group) if err != nil { fmt.Println("error:", err) } os.Stdout.Write(b) Output: {"ID":1,"Name":"Reds","Colors":["Crimson","Red","Ruby","Maroon"]} 示例2 解析JSON

C语言字节对齐问题详解

我怕爱的太早我们不能终老 提交于 2019-12-04 03:48:45
本文转自: https://www.cnblogs.com/clover-toeic/p/3853132.html 引言 考虑下面的结构体定义: 1 typedef struct{ 2 char c1; 3 short s; 4 char c2; 5 int i; 6 }T_FOO; 假设这个结构体的成员在内存中是紧凑排列的,且c1的起始地址是0,则s的地址就是1,c2的地址是3,i的地址是4。 现在,我们编写一个简单的程序: 1 int main(void){ 2 T_FOO a; 3 printf("c1 -> %d, s -> %d, c2 -> %d, i -> %d\n", 4 (unsigned int)(void*)&a.c1 - (unsigned int)(void*)&a, 5 (unsigned int)(void*)&a.s - (unsigned int)(void*)&a, 6 (unsigned int)(void*)&a.c2 - (unsigned int)(void*)&a, 7 (unsigned int)(void*)&a.i - (unsigned int)(void*)&a); 8 return 0; 9 } 运行后输出: 1 c1 -> 0, s -> 2, c2 -> 4, i -> 8 为什么会这样?这就是字节对齐导致的问题。

C\\C++中的 struct 关键字详解

╄→гoц情女王★ 提交于 2019-12-04 02:23:34
struct关键字是用来定义一个新的类型,这个新类型里面可以包含各种其他类型,称为结构体。 1. 什么是结构体 结构体(struct)是一种自定义的数据类型,就是把一组需要在一起使用的数据元素组合成一个新的类型。结构体的作用就是封装,以方便地使用这些封装到一起的属性。 新的类型与C++中基本类型 int ,库类型 string 一样。C++的关键字 struct 是从C语言中的 struct 继承过来的,它们之间有区别与联系。 2. C语言的struct: C语言可以使用结构体 struct 来存放一组不同类型的数据,在C语言中结构体只能包含 变量 ,不能包含 函数 ,定义格式为: struct 结构体名{ 结构体所包含的变量; }; 在定义结构体时,不能在结构体内初始化包含的那些变量,因为结构体声明只是创建一个新的数据类型,还不存在这种类型的变量实体。 >> 注意:花括号{}后面的分号';'不可缺少,因为它是一条定义语句。 例如,我们想定义一个与学生考试成绩有关的数据勾结类型,方便我们的管理,那么新类型所包含的应该有学生的名称,年龄,学号等信息,可以写为如下: struct Student{ char *name; //姓名 int age; //年龄 int school_id; //学号 }; 注意:各个变量都不能在结构体内初始化,因为结构体声明只是创建一个新的数据类型

typedef的4种用法

吃可爱长大的小学妹 提交于 2019-12-03 23:56:44
以下来源于:http://c.biancheng.net/view/298.html C语言 允许用户使用 typedef 关键字来定义自己习惯的数据类型名称,来替代系统默认的基本类型名称、数组类型名称、指针类型名称与用户自定义的结构型名称、共用型名称、枚举型名称等。一旦用户在程序中定义了自己的数据类型名称,就可以在该程序中用自己的数据类型名称来定义变量的类型、数组的类型、指针变量的类型与函数的类型等。 例如,C 语言在 C99 之前并未提供布尔类型,但我们可以使用 typedef 关键字来定义一个简单的布尔类型,如下面的代码所示: typedef int BOOL ; #define TRUE 1 #define FALSE 0 定义好之后,就可以像使用基本类型数据一样使用它了,如下面的代码所示: BOOL bflag =TRUE ; typedef的4种用法 在实际使用中,typedef 的应用主要有如下4种。 1) 为基本数据类型定义新的类型名 也就是说,系统默认的所有基本类型都可以利用 typedef 关键字来重新定义类型名,示例代码如下所示: typedef unsigned int COUNT ; 而且,我们还可以使用这种方法来定义与平台无关的类型。比如,要定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型,即: typedef long

关于结构体大小一篇很详细的文章

有些话、适合烂在心里 提交于 2019-12-03 23:08:30
## 前言 ## 在计算机中数据存储和传输以位(bit)为单位,每8个位bit组成1个字节(Byte)。32位计算机的字长为32位,即4个字节;对应的,64位计算机的字长为64位,即8个字节。计算机系统对基本类型数据在内存中存放的位置有限制,要求这些数据的起始地址的值是某个数k的倍数,这就是所谓的内存对齐,而这个k则被称为该数据类型的对齐模数(alignment modulus)。 ## 结构的存储分配 ## 编译器按照结构体成员列表的顺序为每个成员分配内存,当存储成员时需要满足正确地边界对齐要求时,成员之间可能出现用于填充地额外内存空间。32位系统每次分配字节数最多为4个字节,64位系统分配字节数最多为8个字节。 以下图表是在不同系统中基本类型数据内存大小和默认对齐模数: 注:此外指针所占内存的长度由系统决定,在32位系统下为32位(即4个字节),64位系统下则为64位(即8个字节). ## 没有#pragma pack宏的对齐 ## **对齐规则** : (1)结构体的起始存储位置必须是能够被该结构体中最大的数据类型所整除。 (2)每个数据成员存储的起始位置是自身大小的整数倍(比如int在32位机为4字节,则int型成员要从4的整数倍地址开始存储)。 (3)结构体总大小(也就是sizeof的结果),必须是该结构体成员中最大的对齐模数的整数倍。若不满足

GO基础之结构体

白昼怎懂夜的黑 提交于 2019-12-03 22:28:24
1 、什么是结构体 GO语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。 2、什么是实例化? Go结构体的定义只是一种内存布局的描述,只有当结构体实例化时,才会真正分配内存。因此必须在定义结构体并实例化后才能使用结构体实例化就是根据结构体定义的格式创建一份与格式一致的內存区域。 结构体实例之间的内存是完全独立的。 package main import "fmt" func main() { //实例化方式一 var stu1 Student fmt.Printf("stu1=%T,%v,%q \n", stu1, stu1, stu1) stu1.name = "zs" stu1.age = 12 stu1.sex = 1 fmt.Printf("stu1=%T,%v,%q \n", stu1, stu1, stu1) //实例化方式二 stu2 := Student{} stu2.name = "David" stu2.age = 33 stu2.sex = 1 fmt.Printf("stu2=%T,%v,%q \n", stu2, stu2, stu2) //实例化方式三 stu3 := Student{ name: "Josh", age: 28, sex: 1, } fmt

Go 面向对象编程

寵の児 提交于 2019-12-03 20:09:38
Go 并不是完全面向对象的编程语言。Go 官网的 FAQ 回答了 Go 是否是面向对象语言,摘录如下。 可以说是,也可以说不是。虽然 Go 有类型和方法,支持面向对象的编程风格,但却没有类型的层次结构。Go 中的“接口”概念提供了一种不同的方法,我们认为它易于使用,也更为普遍。Go 也可以将结构体嵌套使用,这与子类化(Subclassing)类似,但并不完全相同。此外,Go 提供的特性比 C++ 或 Java 更为通用:子类可以由任何类型的数据来定义,甚至是内建类型(如简单的“未装箱的”整型)。这在结构体(类)中没有受到限制。 结构体替代类 Go 不支持类,而是提供了结构体。结构体中可以添加属性和方法。这样可以将数据和操作数据的方法绑定在一起,实现与类相似的效果。 文件结构: workspacepath -> oop -> employee -> employee.go workspacepath -> oop -> main.go //employee.go文件package employee import ( "fmt" ) type Employee struct { FirstName string LastName string TotalLeaves int LeavesTaken int } func (e Employee) LeavesRemaining() {

传递结构体变量解决方案,资料整理一

不羁的心 提交于 2019-12-03 13:21:39
1.activex控件返回BSTR* 的方法 用到了 COleDataObject::GetData BOOL GetData( CLIPFORMAT cfFormat , LPSTGMEDIUM lpStgMedium , LPFORMATETC lpFormatEtc = NULL ); 其中第一个参数为 ClipboardFormat 然后查找 The RegisterClipboardFormat function registers a new clipboard format. This format can then be used as a valid clipboard format. UINT RegisterClipboardFormat( LPCTSTR lpszFormat // address of name string); 然后查找 Clipboard 方便在应用程序间或者在应用程序内部传递参数 The clipboard is a set of functions and messages that enable Win32-based applications to transfer data. Because all applications have access to the clipboard, data can be easily

go 学习 (四):接口 & 方法

送分小仙女□ 提交于 2019-12-03 11:16:25
接口声明 // 接口声明 语法:接口是一个 函数签名 的集合,函数签名(函数的声明,不包括实现) type interfaceName interface { method1(param paramType, param paramType...) (returnName returnType ...) method2(param paramType, param paramType...) (returnName returnType ...) } // 接口名一般加 er type writer interface { write(num int) (n int, flag bool) cache(p []byte) int } // 若方法名首字母是大写时,且接口名首字母也是大写时,这个方法可以被接口所在的包(package)之外的代码访问。 // 声明结构体 type structName struct {   filed1 filedType   filed2 filedType } // 实现接口中的方法 func (structVariableName structName) method1 (param paramType, param paramType...) (returnName returnType returName returnType, ...) {