举例,一个结构体的定义如下:

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语言的结构体的更多相关文章

  1. C语言中结构体赋值问题的讨论

    今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...

  2. C语言的结构体和C++结构体的区别

    关于C++中声明结构体中需要使用构造器创建实例对象的语法: <C++的结构体构造方法的基本概念:结构体的构造方法需要和结构体的名字相同,并且无返回值,也不要void关键字,这样的方法就是构造器的 ...

  3. 01.C语言关于结构体的学习笔记

    我对于学习的C语言的结构体做一个小的学习总结,总结如下: 结构体:structure 结构体是一种用户自己建立的数据类型,由不同类型数据组成的组合型的数据结构.在其他高级语言中称为记录(record) ...

  4. C语言中结构体对齐问题

    C语言中结构体对齐问题 收藏 关于C语言中的结构体对齐问题 1,比如: struct{short a1;short a2;short a3;}A;struct{long a1;short a2;}B; ...

  5. 逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式

    逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式 一丶了解什么是结构体,以及计算结构体成员的对其值以及总大小(类也是这样算) 结构体的特性 1.结构体(struct)是由一系列具有相同类型或不 ...

  6. C语言中结构体赋值问题的讨论(转载)

    今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...

  7. go语言学习-结构体

    结构体 go语言中的结构体,是一种复合类型,有一组属性构成,这些属性被称为字段.结构体也是值类型,可以使用new来创建. 定义: type name struct { field1 type1 fie ...

  8. 将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. ...

  9. [日常] Go语言圣经--结构体,JSON习题

    Go语言圣经-结构体 1.结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体 2.通常一行对应一个结构体成员,成员的名字在前类型在后,不过如果相邻的成员类型如果相同的话可以被合并到一行 ...

  10. Go语言中结构体的使用-第2部分OOP

    1 概述 结构体的基本语法请参见:Go语言中结构体的使用-第1部分结构体.结构体除了是一个复合数据之外,还用来做面向对象编程.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. ...

随机推荐

  1. [转]bootstrapTable refresh 方法使用简单举例

    原文地址:https://blog.csdn.net/lanyang123456/article/details/55805478 本文就bootstrapTable refresh 方法如何传递参数 ...

  2. 微服务之springCloud-hystrix参数详解(八)

    简介 上节我们讨论了hystrix+feign+ribbon,但是可能很多人都知道hystrix还有线程隔离,信号量隔离,等等各种参数配置,在这几就记录下hystrix的参数, 一.hystrix参数 ...

  3. MAC OSX 10.10 下启用自带的Apache的rewrite模块

    1.修改Apache配置文件 sudo vim /etc/apache2/httpd.conf LoadModule rewrite_module libexec/apache2/mod_rewrit ...

  4. strtok的基本使用方法

    理论知识自己能够百度这里直接上代码 代码的内容是 HDU(杭电)-1106-排序 排序 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 655 ...

  5. Python Garbage Collection 与 Objective-C ARC

    转载请注明出处 http://blog.csdn.net/u014205968/article/details/69389363 Python GC 与 Objective-C ARC 提起GC(Ga ...

  6. CSS(八):定位属性

    一.position属性 1.relative(相对定位) 相对它原来的位置,通过指定偏移,到达新的位置. 扔在标准流中,它对父级盒子和相邻的盒子都没有任何影响. 看下面的例子: <!DOCTY ...

  7. SpringBoot 集成 Mybatis 使用 Druid数据源 MySQL数据库

    思路: 1.创建项目 项目结构如下: 2.导入相应包 POM.xml文件如下: <?xml version="1.0" encoding="UTF-8"? ...

  8. R语言-向量化操作(apply、tapply、lapply、sapply、mapply、table等)

    一.apply函数(对一个数组按行或者按列进行计算): 使用格式为:apply(X, MARGIN, FUN, ...) 其中X为一个数组:MARGIN为一个向量(表示要将函数FUN应用到X的行还是列 ...

  9. Sword websocket分析二

    //websocket发送数据 int send(uint8_t* message, uint64_t message_size) { //掩码 ] = { 0x12, 0x34, 0x56, 0x7 ...

  10. tensorflow prelu的实现细节

    tensorflow prelu的实现细节 output = tf.nn.leaky_relu(input, alpha=tf_gamma_data,name=name) #tf.nn.leaky_r ...