C語言中結構體直接賦值?
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 |
|
以上程式碼的輸出為:
1 2 |
|
以上用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 |
|
上面的輸出結果為:
1 2 3 4 |
|
可以看到,賦值會直接將t1的指標變數賦值給t2.c,如果我們在賦值之後將t1所用的資源釋放掉,那麼使用t2的話則可能導致記憶體洩漏了。如果上面的程式碼,我們沒有註釋掉 free(p);,那麼輸出t2時結果這不確定了:
1 2 3 4 |
|
所以,如果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 |
|
以上程式碼輸出結果為:
1 2 3 4 |
|
相關文章
- C語言中結構體感悟C語言結構體
- C++11新特性——結構體內直接賦初始值C++結構體
- 關於C語言結構體賦值(linux核心風格)C語言結構體賦值Linux
- C語言中結構體struct的對齊問題C語言結構體Struct
- c語言結構體中的一個char陣列怎麼賦值?C語言結構體陣列賦值
- c語言中的三種迴圈語句結構C語言
- 最全面的C結構體的初始化和賦值結構體賦值
- C語言中函式的返回值C語言函式
- C語言之結構體C語言結構體
- C語言(結構體)C語言結構體
- dotnet C# 給結構體欄位賦值非執行緒安全C#結構體賦值執行緒
- Go語言中結構體打Tag是什麼意思?Go結構體
- 細談C語言中的main返回值 .C語言AI
- c語言中返回整數值的長度C語言
- C語言中編譯和連結C語言編譯
- C++語法-結構體C++結構體
- 嵌入式C語言中的組成結構是什麼C語言
- c語言中的結構(struct)和聯合(union)簡介(轉)C語言Struct
- C語言中sync()C語言
- C語言中有C語言
- C語言結構體專題C語言結構體
- 【c++】深賦值與淺賦值C++賦值
- 在嵌入式C語言中使用結構的方法有哪些C語言
- 《Effective C++》閱讀總結(二):類的構造、析構和賦值C++賦值
- 結構體中的指標&&複製賦值建構函式改造結構體指標賦值函式
- 【C/C++語法基礎】6.結構體(新手推薦):揭開神秘面紗,探索C語言中的“樂高積木”C++結構體C語言
- c語言中%f輸出double型和float型值C語言
- 解構賦值賦值
- Flowmatic:Go語言中結構化併發庫Go
- C語言中的#和##C語言
- ES6:變數的結構賦值變數賦值
- PLSQL Language Reference-PL/SQL語言基礎-變數賦值-使用賦值語句賦值SQL變數賦值
- C 語言中 define 的全部使用方法總結
- C語言中四捨五入問題總結C語言
- JS解構賦值JS賦值
- C語言-->(十四)結構體、巨集、編譯C語言結構體編譯
- C語言結構體作為形參C語言結構體
- C語言_瞭解下結構體指標C語言結構體指標