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.pswp.cn/news/457288.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457288.shtml
英文地址,請注明出處:http://en.pswp.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的服務,不然沒有服…