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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cacti 使用安装详解-企业级实例

Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具。Cacti是通过 snmpget来获取数据,使用 RRDtool绘画图形,它提供了非常强大的数据和用户管理功能,可以指定每一个用户能查看树状结构、host以及任何一张图,还…

MySQL 插入数据时,中文乱码???问题的解决

在终端,mysql -u root -p 登录; show variables like character%; 来查看当前数据库的相关编码集。 client为客户端使用的字符集。connection为连接数据库的字符集设置类型,如果程序没有指明连接数据库使用的字符集类型则按照服务器端默认的字…

mysql时间间隔interval_MySQL DATEDIFF函数获取两个日期的时间间隔的方法

描述返回两个日期之间的时间间隔。语法DateDiff(interval, date1, date2 [ ,firstdayofweek[ , firstweekofyear]] )DateDiff 函数的语法有以下参数:参数描述interval必选。字符串表达式,表示用于计算 date1 和 date2 之间的时间间隔。有关数值&#xff…

linux教程:配置Tomcat开机启动

我们在linux下安装好tomcat之后;经常是需要配置到开机启动的; 这样的话就不需要我们每次重启linux服务器之后自己在登陆运行startup.sh文件启动tomcat了 本次的演示环境是在centos7中完成的;也在centos6.5中测试过;理论上所有版本…

操作系统内存分配算法_操作系统基础45-伙伴系统和slab内存分配

当在用户模式下运行进程请求额外内存时,从内核维护的空闲页帧列表上分配页面。这个列表通常使用页面置换算法来填充,如前所述,它很可能包含散布在物理内存中的空闲页面。也要记住,如果用户进程请求单个字节内存,那么就…

Sublime Text 3新建工程

1. 创建工程 Project > Add Folder to Project 这时在sidebar中将出现刚刚添加的文件目录,如果还需要添加其他目录,则重复这一操作即可。 2. 保存工程 Project > Save Project As 点击保存后Sublime Text将自动生成两个文件: 如图&…

钟国晨 160809323

助教老师好,我是计科三班钟国晨,我对我们专业并不是很了解,至少从目前来看是这样,不过虽然感觉我们专业内容比较复杂,我还是对我们所学的知识挺感兴趣的,我性格比较开朗,希望以后能和老师您多多…

445端口 mysql_关于如何关闭window端口445的详细介绍

首先,来查看下系统当前都开放了什么端口,怎样查看呢?调出cmd命令行程序,输入命令”netstat -na“,可以看到。接着,可以发现当前系统开放了135、445以及5357端口,而且从状态看都处于监听状态”Li…

maven GroupId 和ArtifactId的含义

GroupID是项目组织唯一的标识符,实际对应Java的包的结构,是main目录里java的目录结构。 ArtifactID就是项目的唯一的标识符,实际对应项目的名称,就是项目根目录的名称。

输入圆的半径,计算并输出圆的周长和面积

转载于:https://www.cnblogs.com/nicebaby/p/5866320.html

python解析xml数据_数据开发_Python解析XML文件

解析XML文件XML是可扩展标记语言,主要用于传输和存储数据解析方式使用lxml解析主要注意: text tag attrib 使用方式 有 get() 以及迭代的情况数据示例a31代码示例#!/usr/bin/env python# -*-coding:utf-8-*-# file parse_xml_exp.py# date 2020-10-**fro…

Mac下运行git报错xcrun: error: invalid active developer path ..

错误:xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun 如图: 解决方法: 终端输入: xcode-select --install 之后点击…

CodeForces 15B Laser

题目链接:http://codeforces.com/problemset/problem/15/B题意:给出n*m的一块巧克力,再给出两个点,两点只能同时移动,两点所占位置巧克力会融化,问所有能走位置走遍之后还剩下几块巧克力。思路:…

datetime-时间日期模块

import datetime例1:把nginx的日志格式转化为易懂的格式time 10/Aug/2016:03:20:09 0800a datetime.datetime.strptime(time,%d/%b/%Y:%H:%M:%S %z)a.strftime(%Y%m%d%H%m)转载于:https://blog.51cto.com/liuzhengwei521/1892274

tensorflow独热编码方法_吴恩达课后作业学习2-week3-tensorflow learning-1-基本概念

参考:https://blog.csdn.net/u013733326/article/details/79971488希望大家直接到上面的网址去查看代码,下面是本人的笔记到目前为止,我们一直在使用numpy来自己编写神经网络。现在我们将一步步的使用深度学习的框架来很容易的构建属于自己的…

python运维开发之第八天(socket)

什么是 Socket? Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。 socket()函数 Python 中,我们用 socket()函数来创建…

基于Dubbo框架构建分布式服务

一、Dubbo服务集群容错 假设我们使用的是单机模式的Dubbo服务,如果在服务提供方(Provider)发布服务以后,服务消费方(Consumer)发出一次调用请求,恰好这次由于网络问题调用失败,那么我…

vue样式中背景图片路径_vue打包css文件中背景图片的路径问题

vue-cli写完的静态页面我们在node环境中引入没有问题,但是打包后放在Apache环境下,路径却有问题了如一个简单css语句.all_bg {background: url(../images/all_bg.png) 0 0 no-repeat;display: inline-block;overflow: hidden;background-size: 200px 300…

如果我们不曾相遇

五月天的演唱会定的是9月10号,周六晚上7点。 而我,差不多,从一周前就开始准备了,因为公司最近在赶工,特别忙。为了周末不加班我提前一周就旁敲侧击地询问师父的时间安排,最后又耿直地告诉师父我的周末计划&…

win下php的memcached的安装与使用

1、memcache的php扩展与memcached服务器的区别? php要操作memcached就必须要安装memcache的扩展, 在http://windows.php.net/downloads/pecl/releases/memcache/下载相应版本安装。 而php要操作memcached就必须要有memcached的服务,不然没有服…