精华内容
下载资源
问答
  • 缺省情况下的对齐方式是指C编译器为每一个变量或是数据单元按其自然对界条件分配空间。即每一种数据类型都按照自己的长度对齐...a占据了一,而b需要从4字节倍数开始,则在a后面填充3个字节,结构体总大小要是最大类型

    缺省情况下的对齐方式是指C编译器为每一个变量或是数据单元按其自然对界条件分配空间。即每一种数据类型都按照自己的长度对齐,即结构体的逻辑偏移地址,0开始,每种数据类型都是以他的字节长度的倍数开始分配,如果没有则在前面填充,比如

    struct A

    {

    char a;

    int b;

    char c;

    }

    a占据了一位,而b需要从4字节倍数开始,则在a后面填充3个字节,结构体总大小要是最大类型的整数倍,所以在char后应继续填充3字节,所以SIZEOF(A)为12字节


    C99规定int、unsigned int和bool可以作为位域类型,但编译器几乎都对此作了扩展,允许其它类型类型的存在。
    使用位域的主要目的是压缩存储,其大致规则为:
    1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字
    段将紧邻前一个字段存储,直到不能容纳为止;
    2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字
    段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
    3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方
    式,Dev-C++采取压缩方式;
    4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
    5) 整个结构体的总大小为最宽基本类型成员大小的整数倍

    示例1
    struct BF1
    {
    char f1 : 3;
    char f2 : 4;
    char f3 : 5;
    };
    其内存布局为:
    |__f1___|____f2___ |__|____f3______|______|
    |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|

    位域类型为char,第1个字节仅能容纳下f1f2,所以f2被压缩到第1个字节中,而f3
    能从下一个字节开始。因此sizeof(BF1)的结果为2
    示例2
    struct BF2
    {
    char f1 : 3;
    short f2 : 4;
    char f3 : 5;
    };
    由于相邻位域类型不同,在VC6中其sizeof6,在Dev-C++中为2
    示例3
    struct BF3
    {
    char f1 : 3;
    char f2;
    char f3 : 5;
    };
    非位域字段穿插在其中,不会产生压缩,在VC6Dev-C++中得到的大小均为3




    写出下列程序在X86上的运行结果。

    struct mybitfields
    {
    unsigned short a : 4;
    unsigned short b : 5;
    unsigned short c : 7;
    }test;

    void main(void)
    {
    int i;
    test.a=2;
    test.b=3;
    test.c=0;
    i=*((short *)&test);
    printf("%d ",i);
    }

    这个题的为难之处呢,就在于前面定义结构体里面用到的冒号,如果你能理解这个符号的含义,那么问题就很好解决了。这里的冒号相当于分配几位空间,也即在定义结构体的时候,分配的成员a 4位的空间, b 5位,c 7位,一共是16位,正好两个字节。下面画一个简单的示意:
    变量名 位数
    test 15 14 13 12 11 10 9 |8 7 6 5 4 |3 2 1 0
    test.a | |0 0 1 0
    test.b |0 0 0 1 1 |
    test.c 0 0 0 0 0 0 0 | |
    在执行i=*((short *)&test); 时,取从地址&test开始两个字节(short占两个字节)的内容转化为short型数据,即为0x0032,再转为int型为0x00000032,即50。输出的结果就是50。
    展开全文
  • Go 通过结构体指定字段进行排序

    千次阅读 热门讨论 2020-12-08 11:44:00
    结构体指定字段进行排序: package main import ( "fmt" "sort" ) // 对结构体指定字段进行排序 type User struct { Name string `json:"name"` // `json:"xxx"`:在结构体和json字符串字段顺序不一致的...
    对结构体指定字段进行排序:

      对结构体指定字段进行排序: 

    package main
    
    import (
    	"fmt"
        "sort"
    )
    
    // 对结构体指定字段进行排序
    type User struct {
    	Name string `json:"name"` // `json:"xxx"`:在结构体和json字符串字段顺序不一致的情况下:unmarshal根据tag去寻找对应字段的内容
    	Age  int    `json:"age"`
    }
    
    // type Users []User
    // func SortByAge(u Users) {
    func SortByAge(u []User) {
    	fmt.Printf("源数据:%+v\n", u)
    
    	sort.Slice(u, func(i, j int) bool { // desc
    		return u[i].Age > u[j].Age
    	})
    	fmt.Printf("按Age降序:%+v\n", u)
    
    	sort.Slice(u, func(i, j int) bool { // asc
    		return u[i].Age < u[j].Age
    	})
    	fmt.Printf("按Age升序:%+v\n", u)
    }
    
    func main() {
    	// 初始化结构体对象数组:
    	// 初始化方法1:
    	// users := Users{
    	// 	{
    	// 		Name: "test1",
    	// 		Age:  22,
    	// 	},
    	// 	{
    	// 		Name: "test2",
    	// 		Age:  19,
    	// 	},
    	// 	{
    	// 		Name: "test3",
    	// 		Age:  25,
    	// 	},
    	// }
    
    	// 初始化方法2:
    	var users []User
    	var u User
    	u.Name = "test1"
    	u.Age = 22
    	users = append(users, u)
    	u.Name = "test2"
    	u.Age = 20
    	users = append(users, u)
    	u.Name = "test3"
    	u.Age = 26
    	users = append(users, u)
    
    	SortByAge(users)
    }
    
    // 输出:
    源数据:[{Name:test1 Age:22} {Name:test2 Age:20} {Name:test3 Age:26}]
    按Age降序:[{Name:test3 Age:26} {Name:test1 Age:22} {Name:test2 Age:20}]
    按Age升序:[{Name:test2 Age:20} {Name:test1 Age:22} {Name:test3 Age:26}]
    
    

    此外也可使用sort.Sort()方法,不过需要自己去实现 Len()、Swap()、Less()方法,参考:golang对自定义类型排序

    另外,通过借助“结构体指定字段进行排序”解了一道LeetCode 347题:传送门

    补充示例:同时对多个字段进行排序(升序/降序)

    package main
    
    import (
    	"fmt"
    	"sort"
    )
    
    type User struct {
    	Name  string
    	High  int
    	Wight int
    }
    
    // 先根据身高 High 排序,在High相等时,再根据体重 Wight 排序,最后返回排序后结果
    func TestSort(userArr []User) []User {
    	for i, val := range userArr {
    		userArr[i] = User{Name: val.Name, High: val.High, Wight: val.Wight}
    	}
    
    	sort.Slice(userArr, func(i, j int) bool { // 根据High降序
    		return userArr[i].High > userArr[j].High
    	})
    
    	sort.Slice(userArr, func(i, j int) bool {
    		if userArr[i].High == userArr[j].High { // 当High相等时
    			return userArr[i].Wight > userArr[j].Wight // 根据Wight降序
    		} else {
    			return userArr[i].High > userArr[j].High
    		}
    	})
    
    	return userArr
    }
    
    func main() {
    	userInfoArr := TestSort([]User{
    		{
    			Name:  "user1",
    			High:  170,
    			Wight: 60,
    		},
    		{
    			Name:  "user2",
    			High:  170,
    			Wight: 80,
    		},
    		{
    			Name:  "user1",
    			High:  185,
    			Wight: 60,
    		},
    	})
    	fmt.Println("userInfoArr: ", userInfoArr)
    }
    

    展开全文
  • 两个结构体(可能类型一样), 字段名和类型都一样, 想复制一个结构体的全部或者其中某几个字段的值到另一个(即merge操作), 自然想到可以用反射实现. package main import fmt import reflect // 用b的所有字段覆盖a的 ...
  • 直接上代码: type User struct{ Username string `json:"Username"` Socre float`json:"Socre...//获取结构体字段的名称 func GetFieldName(columnName string, info User) float64 { var val float64...

    直接上代码:

     type User struct{

        Username   string `json:"Username"`

     

        Socre  float  `json:"Socre"`

    }

    //获取结构体中字段的名称
    func GetFieldName(columnName string, info User) float64 {
    	var val float64
    	t := reflect.TypeOf(info)
    	if t.Kind() == reflect.Ptr {
    		t = t.Elem()
    	}
    	if t.Kind() != reflect.Struct {
    		fmt.Println("Check type error not Struct")
    		return 0
    	}
    	fieldNum := t.NumField()
    	for i := 0; i < fieldNum; i++ {
    		if strings.ToUpper(t.Field(i).Name) == strings.ToUpper(columnName) {
    			v := reflect.ValueOf(info)
    			val := v.FieldByName(t.Field(i).Name).Float()
    			return val
    		}
    	}
    	return val
    }
    

    使用:

    GetFieldName("score",userinfo)

    展开全文
  • 结构体嵌套字段冲突

    2021-07-29 08:41:52
    嵌套结构体字段名冲突 type address struct { province string city string } type workPlace struct { city string } type person struct { name string age int address workPlace } func main() { p1:...
    嵌套结构体字段名冲突
    
    type address struct {
    	province string
    	city  string
    }
    type workPlace struct {
    	city string
    }
    type person struct {
    	name  string
    	age    int
    	 address
    	workPlace
    }
    
    func main()  {
    	p1:=person{
    		  name:"逍遥",
    		  age: 18,
    		  address:address{
    		  	province: "北京",
    		  	city: "朝阳",
    		  },
    		  workPlace:workPlace{
    
    		  },
    	}
    	//fmt.Println(p1.city)
    	终端报错的内容: // ambiguous(模棱两可) selector p1.city
    	
    	原因:
    	//因为 address 和workPlace中都含有city 不知道选哪个
    
    
    	fmt.Println(p1.address.city)
    	fmt.Println(p1.workPlace.city)
    
    
    }
    
    展开全文
  • 文章目录结构体位字段 结构体位字段
  • 结构体保留字段定义

    千次阅读 2019-09-12 16:53:22
    使用结构体时常为了对齐或匹配需要定义一些保留字段,比如定义一个结构体来描述某设备寄存器,因为寄存器本身不是连续的所以在空缺位置要定义保留字段,如下所示: typedef struct { volatile UINT16 fifo; ...
  • C#中结构体实例字段

    2012-07-09 10:31:53
    结构体实例字段定义:  缺省初始化是调用编译器声明的缺省构造函数  在用户自定义的构造函数中必须显式初始化  不能在它们声明时初始化 struct Pair { public Pair(int x, int y) { this.x = x...
  • GoLang通过反射获取结构体字段

    千次阅读 2018-12-14 16:54:49
    //获取结构体字段的名称 func GetFieldName ( structName interface { } ) [ ] string { t := reflect . TypeOf ( structName ) if t . Kind ( ) == reflect . Ptr { t = t . Elem ( )...
  • golang通过反射获取结构体字段

    万次阅读 2018-02-08 18:42:00
    //获取结构体字段的名称 func GetFieldName(structName interface{}) []string { t := reflect.TypeOf(structName) if t.Kind() == reflect.Ptr { t = t.Elem() } if t.Kind() != reflect.Struct { log....
  • Golang中, struct结构体忽略字段的方法

    千次阅读 2020-09-24 10:59:53
    1 字段名小写 age 字段不会被外包访问...结构体转JSON时,如果 addr 是零值,就会忽略这个字段 type Person struct { Name string `json:"name"` Age int `json:"age"` Addr string `json:"addr,omitempty"` } ...
  • #define STRUCTFILEDADDR(T,Field) \ (long long)(&(((T*)0)->Field))
  • 结构体位字段

    2015-06-03 20:48:49
    基础  类似于java中的bean,只不过里面的属性都是... 定义结构体使用struce关键字。如下:struct Person{ int age; char * name; }; 这便定义了一个名为Person的结构体。注意:在定义结构体的最后需要加分号。
  • 结构体对应字段类型设为指针类型,一劳永逸,不用担心json序列化与反序列化问题 type ArticleDetail struct { ArticleInfo Content *string `db:"content"` }
  • Struct结构体位字段

    2011-12-24 00:06:04
    在后来看到可以为结构体指定一个没有名称的字段作为跳过字中的某些, 或都指定一个无名且长度为0的字段作为单位边界的开始点. 就开始觉得是否这些位字段在内存的位置是以为单位连在一起作为一...
  • 参照的结构体字段数不够,除了se11修改结构之外,还可以在声明时用INCLUDE,如果不修改结构,在SE37运行测试是看不到这个字段的。 Definition TYPES|DATA:  BEGIN OF struc1.  ...  k2 [TYPE ...
  • 这一节将继续介绍如何将数据库查询到的结果映射到结构体字段中,映射时主要通过结构体中的tag标签来实现匹配映射。这个操作需要用到go中的reflect包来实现。主要思路是: 循环取出映射中的数据,然后比较取出的数据...
  • 案例:使用反射来遍历结构体字段,调用结构体的方法,并获取结构体标签的值。 package main import ( "fmt" "reflect" ) //定义Monster结构体 type Monster struct { Name string `json:"name"` Age int `...
  • Matlab将结构体struct字段内的数据转化到矩阵中

    万次阅读 多人点赞 2018-10-24 17:57:40
    假设structure1,为一结构体,structure1.name为100个字符串 怎么将这些字符串不用循环一次性赋值到矩阵A?? A=structure1.name 为什么只是将第一个赋值过去? 答案是可以使用cat函数: 可以用cat函数,...
  • 转自:https://blog.csdn.net/cui_yonghua/article/details/95079778(仅做... package main import ( "fmt" "reflect" ...//定义Monster结构体 type Monster struct { Name string `json:"name"` Age int `...
  • 在字符串中搜索包含在给定结构中的字段名称,然后用相应的字段值替换每次出现的字段名称。 在需要改变参数的模拟过程中,我使用它来动态更改绘图上的标题。 图片中的标题代码: % 正常使用(第 2 行) >> q.mu = 0...
  • 通过反射 获取 结构体字段,设置结构体字段 /* * Copyright(C),2019-2020, email: 952651117@qq.com * Author: dao * Version: 1.0.0 * Date: 2021/6/8 17:14 * Description: * */ package main import ( "fmt" ...
  • % 查找集合中某个元素的位置 C = {'xlh','gyl','xyh'}; c = strcmp(C,'gyl');...% Struct结构体某个字段值的位置 S = repmat(struct('name',[],'age',[],'sex',[]),3,1);S(1).name = 'xlh'; S(1).age = '20

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 69,968
精华内容 27,987
关键字:

结构体的位字段