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

简单结构体的赋值

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

我们先下面一段代码:

#include

#include

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;

}

以上代码的输出为:

MyStruct t1: 1, 2, hello

MyStruct t2: 1, 2, hello

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

有指针成员的结构体赋值

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

#include

#include

#include

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;

}

上面的输出结果为:

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时结果这不确定了:

MyStruct t1: 1, 2, hello

MyStruct t2: 1, 2, (/.?

t1 pointer addr: 0x6000284d0

t2 pointer addr: 0x6000284d0

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

#include

#include

#include

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;

}

以上代码输出结果为:

MyStruct t1: 1, 2, hello

MyStruct t2: 1, 2, hello

t1 pointer addr: 0x6000284d0

t2 pointer addr: 0x600062e10

java发送c语言结构体_C语言中结构体直接赋值?相关推荐

  1. c++ new一个结构体_C语言结构体,又一个纸老虎,纯干货讲解(附代码)

    来源:网络,排版整理:晓宇 微信公众号:芯片之家(ID:chiphome-dy)结构体的定义结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构.结构体和其他类型基础数 ...

  2. 第十章 结构体_C语言共用体(C语言union用法)详解

    通过前面的讲解,我们知道结构体(Struct)是一种构造类型或复杂类型,它可以包含多个类型不同的成员.在C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(Union),它的定义格式为:  un ...

  3. java版数据结构解迷宫问题_C语言数据结构之迷宫问题

    本文实例为大家分享了数据结构c语言版迷宫问题栈实现的具体代码,供大家参考,具体内容如下 程序主要参考自严蔚敏老师的数据结构c语言版,在书中程序的大体框架下进行了完善.关于迷宫问题的思路可查阅原书. # ...

  4. java和c语言的区别_C语言为何不会过时?你需要掌握多少种语言?

    关注.星标公众号,不错过精彩内容 整理/排版:付斌 转自:嵌入式ARM 01 为什么C语言不会过时 评价任何一门编程语言,都是招人骂的.永远是这样.就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过 ...

  5. C语言结构体与C++中结构体和类的区别

    在C++中除了类中可以有构造函数和析构函数外,结构体中也可以包含构造函数和析构函数,这是因为结构体和类基本雷同,唯一区别是,类中成员变量默认为私有,而结构体中则为公有.注意,C++中的结构体是可以有析 ...

  6. c语言笔记照片_c语言笔记

    如何看懂一个程序,分三步 1. 流程 2. 每个语句的功能 3. 试数 对于一些小程序的算法 尝试自己去编程解决它,大部分人都无法自己解决 如果解决不了,尝试看答案 关键要把答案看懂,这个要花很大的精 ...

  7. c语言笔记照片_C语言入门这一篇就够了-学习笔记

    按照之前的计划,这篇文章本该写C语言简介,包括一些历史背景,发展状况, 语言特点什么的,这些东西着实比较啰嗦. 吃饭用的筷子,到现在我都不知道它的由来,不知道它是在什么历史背景下诞生的 有些东西还是有 ...

  8. 基于c语言优先级病房呼叫_C语言

    数据类型关键字 基本数据类型(5个) void:声明函数无返回值或无参数,声明无类型指针,显示丢弃去处结果 char:字符型类型数据,属于整型数据的一种 int:整型数据,通常为编译器指定的机器字长 ...

  9. c语言getchar用法_C语言 — 关键字

    几十个关键字不多,用得多了自然会记住,相信大家也不会担心.下面是C语言中的 32 个关键字: 一丶C语言关键字 第一个关键字:auto 用来声明自动变量.可以显式的声明变量为自动变量.只要不是声明在所 ...

最新文章

  1. [置顶] JDK工具(零)--简要介绍JDK1.6自带的42个工具
  2. 【深度学习的数学】激活函数的作用是什么?
  3. 很多初接触乐鑫ESP32/ESP8266 模块时,都不清楚怎么为 ESP32、ESP8266 系列模组烧录固件呢?这里以启明云端WT8266-S5(ESP-12F)和ESP32-WROOM模块为例说明
  4. 二叉树的层序遍历—leetcode102
  5. 添加库路经 linux,linux下的静态库与动态库
  6. sqlsever 转mysql 出错 MySQL max_allowed_packet设置及问题
  7. XPath与lxml类库
  8. win10一直卡在自动修复_分享:win10自动修复过程中无法正确启动怎么办?
  9. 学会这2招,不用设计师,一样能做出精美炫酷的可视化大屏模板
  10. 信息系统安全复习提纲
  11. discord android .apk,Discord语音交流app
  12. 一篇文章带你彻底了解Kubernetes
  13. 英语四级计算机准考证号查询,2016英语四级准考证号忘了怎么查成绩
  14. 使用python调整excel表格的行和列以及合并或拆分单元格
  15. codewars练习(javascript)-2021/2/18
  16. 什么是会员标签?会员标签有什么作用呢?
  17. HCNA基础篇问答式笔记整理
  18. 苦练SOC“基本功”启明星辰九年磨一剑
  19. 计算CDS中密码子的数量
  20. 工业设备刀具检测常用特征值提取方法及决策方法

热门文章

  1. 消息队列技术介绍 : ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ
  2. 狗窝里的小日子- 7 ...
  3. HDU 3916 Sequence Decomposition 【贪心】
  4. get和post 两种基本请求方式的区别
  5. 4、容器虚拟化网络概述
  6. vim 正则非贪婪模式
  7. tinydate.js[v0.3] 新增了字符串格式化为日期对象的函数
  8. SPOJ 694/705 后缀数组
  9. SharePoint 2013 Workflow - Advanced Workflow Debugging with Fiddler
  10. 关于反射的我的一些看法