C语言的结构体
举例,一个结构体的定义如下:
typedef struct _foo {
char name[];
int age;
int sex;
} foo;
对齐
如果直接对上面的结构体作sizeof()运算:
printf("%d\n", sizeof(foo)); //
如果在成员名后面加上冒号,指定占用的bits数,可以节省结构体的大小,例如:
typedef struct _foo {
char name[];
int age:;
int sex:;
} foo;
可以使用下面的宏计算结构体中某个成员的偏移位置:
#define offset(type, member) ((int) &((type*)0) ->member)
演示如何计算成员的位置:
foo f1 = {"cq", , };
char *p = &f1;
int age = *(int*) (p + offset(foo, age)); // equivalent f1->age
初始化
结构体变量在定义的同时进行初始化,类似于数组的初始化:
foo f1 = {"zy", , };
也可以只对部分成员进行初始化:
foo f2 = {"zy", };
未显示初始化的成员会有默认值。
还可以使用如下的初始化方法:
foo f3 = {
.age = ,
.name = "cq",
.sex = ,
};
这种方法可以打乱结构体成员赋值的顺序,在Linux内核中经常使用这种赋值方法,增强代码的可移植性(比如有些成员在不同平台可能被编译,可能不编译)。
下面这种写法也是一样的:
foo f4 = {
age : ,
sex : ,
name : "cq",
};
赋值
同类型的结构体变量之间可以互相赋值:
foo f1 = {"zy", , };
foo f2 = f1;
但如果有指针成员,就要特别小心了,例如:
typedef struct _foo {
char *name;
int age;
int sex;
} foo;
foo f1;
f1.name = strdup("bush");
f1.age = ;
f1.sex = ;
foo f2 = f1;
这里的 f1.name 和 f2.name 两个成员指针指向的是同一块内存(即浅拷贝),释放其中任何一个,都会影响另外一个。
C语言的结构体的更多相关文章
- C语言中结构体赋值问题的讨论
今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...
- C语言的结构体和C++结构体的区别
关于C++中声明结构体中需要使用构造器创建实例对象的语法: <C++的结构体构造方法的基本概念:结构体的构造方法需要和结构体的名字相同,并且无返回值,也不要void关键字,这样的方法就是构造器的 ...
- 01.C语言关于结构体的学习笔记
我对于学习的C语言的结构体做一个小的学习总结,总结如下: 结构体:structure 结构体是一种用户自己建立的数据类型,由不同类型数据组成的组合型的数据结构.在其他高级语言中称为记录(record) ...
- C语言中结构体对齐问题
C语言中结构体对齐问题 收藏 关于C语言中的结构体对齐问题 1,比如: struct{short a1;short a2;short a3;}A;struct{long a1;short a2;}B; ...
- 逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式
逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式 一丶了解什么是结构体,以及计算结构体成员的对其值以及总大小(类也是这样算) 结构体的特性 1.结构体(struct)是由一系列具有相同类型或不 ...
- C语言中结构体赋值问题的讨论(转载)
今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...
- go语言学习-结构体
结构体 go语言中的结构体,是一种复合类型,有一组属性构成,这些属性被称为字段.结构体也是值类型,可以使用new来创建. 定义: type name struct { field1 type1 fie ...
- 将c语言的结构体定义变成对应的golang语言的结构体定义,并将golang语言结构体变量的指针传递给c语言,cast C struct to Go struct
https://groups.google.com/forum/#!topic/golang-nuts/JkvR4dQy9t4 https://golang.org/misc/cgo/gmp/gmp. ...
- [日常] Go语言圣经--结构体,JSON习题
Go语言圣经-结构体 1.结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体 2.通常一行对应一个结构体成员,成员的名字在前类型在后,不过如果相邻的成员类型如果相同的话可以被合并到一行 ...
- Go语言中结构体的使用-第2部分OOP
1 概述 结构体的基本语法请参见:Go语言中结构体的使用-第1部分结构体.结构体除了是一个复合数据之外,还用来做面向对象编程.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. ...
随机推荐
- plot sin示意图(隐藏刻度,自定义刻度)
plot sin示意图(隐藏刻度,自定义刻度) 隐藏坐标轴刻度 自定义坐标轴刻度 Code #!/usr/bin/env python # -*- coding: utf-8 -*- import n ...
- Spring Bean装配学习
解释:所谓装配就是把一个类需要的组件给它设置进去,英文就是wire,wiring:注解Autowire也叫自动装配. 目前Spring提供了三种配置方案: 在XML中进行显式的配置 在Java中进行显 ...
- selenium.common.exceptions.WebDriverException: Message: "Can't load the profile.
记录一下,Selenium在最新版本中修好了这个问题.运行CMD,然后输入 pip install -U selenium
- jython 2.7.1 版本开发历史
很多技术一直感兴趣,在工作中没有太多实践的机会,但可以持续关注.Jython最初是Python on JVM,所以最初的名称是JPython,后续由于基于JVM可以有更多可能性,名字改为Jython. ...
- [RTC]系统和RTC的时间保持一致
hwclock输出的格式似乎是没有格式化的命令,所以只能修改date date "+%a %d %b %Y %I:%M:%S %p %Z"
- Netty4.x中文教程系列(二) Hello World !<转>
在中国程序界.我们都是学着Hello World !慢慢成长起来的.逐渐从一无所知到熟悉精通的. 第二章就从Hello World 开始讲述Netty的中文教程. 首先创建一个Java项目.引入一个N ...
- update更新另一个字段
1. 写法轻松,更新效率高:update table1 set field1=table2.field1,field2=table2.field2from table2where table1.id= ...
- SpringBoot2 使用@RestController 无法返回一个地址,前台无法渲染为页面,只能返回json数据
spring boot之访问静态页面 楼主前两天自学spring boot,然后在学习的过程中,出现一个疑问,就是如何去访问静态的html网页,这个问题,楼主上网上搜了下,找到的是在resource目 ...
- python 获取前一天凌晨unix时间
# -*- coding:utf-8 -*-import time now_time = int(time.time())day_time = now_time - now_time % 86400 ...
- DataWindow.Net组件示例(全部开源)
1概述 1.1功能简介 Sybase公司的PowerBuilder开发工具,在以前VS工具没有成事以前,是相当风光的.微软都要与其合作,学习它Db方面的技术,才成就了SQLServer数据库.PB开发 ...