FROM:http://codewenda.com/c语言结构体直接赋值/

在C语言中结构体变量之间可以进行赋值操作吗?

简单结构体的赋值

先说结论:一般来说,C语言中的结构体变量可以用另一个变量对其进行赋值或初始化。简单结构体(不包含指针成员)直接赋值没有问题。
我们先下面一段代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#include <stdio.h>

#include <stdlib.h>

struct MyStruct

{

    int a;

    int b;

    char c[10];

};

int main()

{

    struct MyStruct t1 = {1, 2, "hello"};

    struct MyStruct t2 = {3, 4, "world"};

    t2 = t1; //将t1赋值给t2

    printf("MyStruct t1: %d, %d, %s\n", t1.a, t1.b, t1.c);

    printf("MyStruct t2: %d, %d, %s\n", t2.a, t2.b, t2.c);

    return 0;

}

以上代码的输出为:

1

2

MyStruct t1: 1, 2, hello

MyStruct t2: 1, 2, hello

以上用t1给t2进行初始化,结果也相同。可以看到简单的结构体(结构体的成员没有指针成员)变量之间直接赋值是没有问题的。

有指针成员的结构体赋值

而通常情况下,稍微复杂一点的结构体里面会有指针成员,那么以上的浅拷贝则会有问题了,我们假设MyStruct里面的成员c不是数组,而是字符指针,会有什么问题呢?
看如下代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

struct MyStruct

{

    int a;

    int b;

    char* c;

};

int main()

{

    struct MyStruct t1;

    t1.a = 1;

    t1.b = 2;

    // 为指针区域赋值

    char *p = (char*)malloc(10*sizeof(char));

    strcpy(p, "hello");

    t1.c = p;

    struct MyStruct t2;

    t2 = t1;

    printf("MyStruct t1: %d, %d, %s\n", t1.a, t1.b, t1.c);

    // 释放了t1的内存

    // free(p);

    printf("MyStruct t2: %d, %d, %s\n", t2.a, t2.b, t2.c);

    printf("t1 pointer addr: %p\n", t1.c);

    printf("t2 pointer addr: %p\n", t2.c);

    return 0;

}

上面的输出结果为:

1

2

3

4

MyStruct t1: 1, 2, hello

MyStruct t2: 1, 2, hello

t1 pointer addr: 0x6000284d0

t2 pointer addr: 0x6000284d0

可以看到,赋值会直接将t1的指针变量赋值给t2.c,如果我们在赋值之后将t1所用的资源释放掉,那么使用t2的话则可能导致内存泄漏了。如果上面的代码,我们没有注释掉 free(p);,那么输出t2时结果这不确定了:

1

2

3

4

MyStruct t1: 1, 2, hello

MyStruct t2: 1, 2, (/.?

t1 pointer addr: 0x6000284d0

t2 pointer addr: 0x6000284d0

所以,如果struct中有指针成员,那么结构体赋值不能简单的直接复制了,而需要为指针成员另外分配内存,并将数据拷贝过去,当然我们可以将这些处理封装在单独的函数中来完成。
示例代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

struct MyStruct

{

    int a;

    int b;

    char* c;

};

int main()

{

    struct MyStruct t1;

    t1.a = 1;

    t1.b = 2;

    // 为指针区域赋值

    char *p = (char*)malloc(10*sizeof(char));

    strcpy(p, "hello");

    t1.c = p;

    struct MyStruct t2;

    // 各个成员分别赋值,可以进行封装

    t2.a = t1.a;

    t2.b = t1.b;

    char *p2 = (char*)malloc(10*sizeof(char));

    strcpy(p2, t1.c);

    t2.c = p2;

    printf("MyStruct t1: %d, %d, %s\n", t1.a, t1.b, t1.c);

    // 释放了t1的内存

    free(p);

    printf("MyStruct t2: %d, %d, %s\n", t2.a, t2.b, t2.c);

    // 释放了t2的内存

    free(p2);

    printf("t1 pointer addr: %p\n", t1.c);

    printf("t2 pointer addr: %p\n", t2.c);

    return 0;

}

以上代码输出结果为:

1

2

3

4

MyStruct t1: 1, 2, hello

MyStruct t2: 1, 2, hello

t1 pointer addr: 0x6000284d0

t2 pointer addr: 0x600062e10

C语言中结构体直接赋值相关推荐

  1. java发送c语言结构体_C语言中结构体直接赋值?

    在C语言中结构体变量之间可以进行赋值操作吗? 简单结构体的赋值 先说结论:一般来说,C语言中的结构体变量可以用另一个变量对其进行赋值或初始化.简单结构体(不包含指针成员)直接赋值没有问题. 我们先下面 ...

  2. C 语言中结构体强制转换--实验

    2019独角兽企业重金招聘Python工程师标准>>> 对于C语言中结构体强制转换做了如下实验, 或许可以解惑一些问题 对于结构体, 我理解的属性有: 成员的顺序, 成员的类型,成员 ...

  3. c语言中申请内存并初始化,c语言中结构体的定义、初始化及内存分配

    #include struct person { char *name; int age; }; int main() { //结构体可以定义在函数内,也可以定义到函数外 //相当于全局变量与局部变量 ...

  4. c语言结构体成员变量私有化,C语言中结构体变量私有化详解

    C语言中结构体变量私有化详解 背景介绍 操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚 ...

  5. c语言如何将值赋给结构体指针,C语言给结构体指针赋值

    <C语言给结构体指针赋值>由会员分享,可在线阅读,更多相关<C语言给结构体指针赋值(6页珍藏版)>请在人人文库网上搜索. 1.指向结构体的指针 在C语言中几乎可以创建指向任何类 ...

  6. c语言定义学生结构体类型,C语言中结构体的三种定义方式

    c语言中结构体的定义: struct 结构体名{ 成员列表: ..... }结构体变量: 7.1.1 结构体类型变量的定义 结构体类型变量的定义与其它类型的变量的定义是一样的,但由于结构体类型需要针对 ...

  7. C语言对结构体进行赋值操作

    C语言对结构体进行赋值操作 一.说明 二.环境 三.代码 四.运行 一.说明 定义一个结构体: 并对其进行初始化操作,赋值操作,打印1.注意, struct 定义的位置可以在main函数的外边2.用的 ...

  8. Go语言中结构体打Tag是什么意思?

    前言 哈喽,大家好,我是asong.今天想与大家分享Go语言中结构体标签是怎么使用的,以及怎样定制自己的结构体标签解析. 大多数初学者在看公司的项目代码时,看到的一些结构体定义会是这样的: type ...

  9. Go语言中结构体打 Tag 是什么意思?

    前言 哈喽,大家好,我是asong.今天想与大家分享Go语言中结构体标签是怎么使用的,以及怎样定制自己的结构体标签解析. 大多数初学者在看公司的项目代码时,看到的一些结构体定义会是这样的: type ...

最新文章

  1. Linux存储的基本管理
  2. sw运行很卡怎么办_windows10系统SolidWorks运行速度很慢如何解决
  3. 物联网数据库需求——写入快,分析能力强
  4. H265的国标PS流打包
  5. CString, BSTR, LPCTSTR 概念(转)
  6. OpenCV——素描
  7. mysql对日期的操作_MySql对日期的操作
  8. std::map的[]方法重写
  9. 0代码隐藏GroupedTableView上边多余的间隔
  10. TCP UDP 套接字
  11. AD软件系统参数的一些基本设置(Altium Designer 20 19(入门到精通全38集)四层板智能车PCB设计视频教程AD19 AD20 凡亿)
  12. 计算机开机错误怎么办,电脑开机蓝屏错误代码0X0000007E怎么办?
  13. JavaScript编程入门
  14. requestLayout() improperly called by xxxxxxxxxxxxxxxxxxx ScrollViewContainer 问题
  15. 对话旷视科技孙剑:iPhone X之外 人脸识别到底安不安全? | AI英雄
  16. AUTOCAD——JOIN合并命令
  17. 巴菲特的在University of Florida商学院的一次演讲
  18. 介绍Jackson JsonParser解析json
  19. CTime 的一般常用方法
  20. Converged Containers and Applications

热门文章

  1. 中国国家气象局天气预报信息接口代码引用详细说明与教程
  2. 上海数据交易中心成立 全国多地力推大数据产业
  3. screenfull全屏显示
  4. 电信老总气疯了(爆笑版)!!
  5. (二)TCP客户端/服务器通信------select函数
  6. 信安数基Z/nZ的含义
  7. 国产源表之纳米水伏发电材料研究
  8. CHM文件无法打开的解决方法
  9. 2022春夏五大系列新品亮相,都市丽人构建多层次的产品矩阵
  10. 使用Selenium启动IE浏览器