java发送c语言结构体_C语言中结构体直接赋值?
在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语言中结构体直接赋值?相关推荐
- c++ new一个结构体_C语言结构体,又一个纸老虎,纯干货讲解(附代码)
来源:网络,排版整理:晓宇 微信公众号:芯片之家(ID:chiphome-dy)结构体的定义结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构.结构体和其他类型基础数 ...
- 第十章 结构体_C语言共用体(C语言union用法)详解
通过前面的讲解,我们知道结构体(Struct)是一种构造类型或复杂类型,它可以包含多个类型不同的成员.在C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(Union),它的定义格式为: un ...
- java版数据结构解迷宫问题_C语言数据结构之迷宫问题
本文实例为大家分享了数据结构c语言版迷宫问题栈实现的具体代码,供大家参考,具体内容如下 程序主要参考自严蔚敏老师的数据结构c语言版,在书中程序的大体框架下进行了完善.关于迷宫问题的思路可查阅原书. # ...
- java和c语言的区别_C语言为何不会过时?你需要掌握多少种语言?
关注.星标公众号,不错过精彩内容 整理/排版:付斌 转自:嵌入式ARM 01 为什么C语言不会过时 评价任何一门编程语言,都是招人骂的.永远是这样.就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过 ...
- C语言结构体与C++中结构体和类的区别
在C++中除了类中可以有构造函数和析构函数外,结构体中也可以包含构造函数和析构函数,这是因为结构体和类基本雷同,唯一区别是,类中成员变量默认为私有,而结构体中则为公有.注意,C++中的结构体是可以有析 ...
- c语言笔记照片_c语言笔记
如何看懂一个程序,分三步 1. 流程 2. 每个语句的功能 3. 试数 对于一些小程序的算法 尝试自己去编程解决它,大部分人都无法自己解决 如果解决不了,尝试看答案 关键要把答案看懂,这个要花很大的精 ...
- c语言笔记照片_C语言入门这一篇就够了-学习笔记
按照之前的计划,这篇文章本该写C语言简介,包括一些历史背景,发展状况, 语言特点什么的,这些东西着实比较啰嗦. 吃饭用的筷子,到现在我都不知道它的由来,不知道它是在什么历史背景下诞生的 有些东西还是有 ...
- 基于c语言优先级病房呼叫_C语言
数据类型关键字 基本数据类型(5个) void:声明函数无返回值或无参数,声明无类型指针,显示丢弃去处结果 char:字符型类型数据,属于整型数据的一种 int:整型数据,通常为编译器指定的机器字长 ...
- c语言getchar用法_C语言 — 关键字
几十个关键字不多,用得多了自然会记住,相信大家也不会担心.下面是C语言中的 32 个关键字: 一丶C语言关键字 第一个关键字:auto 用来声明自动变量.可以显式的声明变量为自动变量.只要不是声明在所 ...
最新文章
- [置顶] JDK工具(零)--简要介绍JDK1.6自带的42个工具
- 【深度学习的数学】激活函数的作用是什么?
- 很多初接触乐鑫ESP32/ESP8266 模块时,都不清楚怎么为 ESP32、ESP8266 系列模组烧录固件呢?这里以启明云端WT8266-S5(ESP-12F)和ESP32-WROOM模块为例说明
- 二叉树的层序遍历—leetcode102
- 添加库路经 linux,linux下的静态库与动态库
- sqlsever 转mysql 出错 MySQL max_allowed_packet设置及问题
- XPath与lxml类库
- win10一直卡在自动修复_分享:win10自动修复过程中无法正确启动怎么办?
- 学会这2招,不用设计师,一样能做出精美炫酷的可视化大屏模板
- 信息系统安全复习提纲
- discord android .apk,Discord语音交流app
- 一篇文章带你彻底了解Kubernetes
- 英语四级计算机准考证号查询,2016英语四级准考证号忘了怎么查成绩
- 使用python调整excel表格的行和列以及合并或拆分单元格
- codewars练习(javascript)-2021/2/18
- 什么是会员标签?会员标签有什么作用呢?
- HCNA基础篇问答式笔记整理
- 苦练SOC“基本功”启明星辰九年磨一剑
- 计算CDS中密码子的数量
- 工业设备刀具检测常用特征值提取方法及决策方法
热门文章
- 消息队列技术介绍 : ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ
- 狗窝里的小日子- 7 ...
- HDU 3916 Sequence Decomposition 【贪心】
- get和post 两种基本请求方式的区别
- 4、容器虚拟化网络概述
- vim 正则非贪婪模式
- tinydate.js[v0.3] 新增了字符串格式化为日期对象的函数
- SPOJ 694/705 后缀数组
- SharePoint 2013 Workflow - Advanced Workflow Debugging with Fiddler
- 关于反射的我的一些看法