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語言中結構體struct的對齊問題C語言結構體Struct
- c語言結構體中的一個char陣列怎麼賦值?C語言結構體陣列賦值
- c語言中的三種迴圈語句結構C語言
- 最全面的C結構體的初始化和賦值結構體賦值
- C語言中函式的返回值C語言函式
- C語言之結構體C語言結構體
- dotnet C# 給結構體欄位賦值非執行緒安全C#結構體賦值執行緒
- C語言中編譯和連結C語言編譯
- Go語言中結構體打Tag是什麼意思?Go結構體
- c語言中返回整數值的長度C語言
- C++語法-結構體C++結構體
- 嵌入式C語言中的組成結構是什麼C語言
- 在嵌入式C語言中使用結構的方法有哪些C語言
- C語言結構體專題C語言結構體
- C語言結構體大小分析C語言結構體
- c語言中%f輸出double型和float型值C語言
- 【C/C++語法基礎】6.結構體(新手推薦):揭開神秘面紗,探索C語言中的“樂高積木”C++結構體C語言
- 《Effective C++》閱讀總結(二):類的構造、析構和賦值C++賦值
- C語言中的#和##C語言
- Flowmatic:Go語言中結構化併發庫Go
- 結構體中的指標&&複製賦值建構函式改造結構體指標賦值函式
- C語言中四捨五入問題總結C語言
- C語言結構體作為形參C語言結構體
- C語言-->(十四)結構體、巨集、編譯C語言結構體編譯
- 解構賦值賦值
- c語言中sizeof詳解C語言
- 解析C語言中的sizeofC語言
- C語言中extern的用法C語言
- c語言中的作用域C語言
- 【C】 30_C語言中的字串C語言字串
- ES6:變數的結構賦值變數賦值
- C語言教程——03 C語言結構C語言
- C 語言結構體記憶體佈局問題結構體記憶體
- C語言結構體記憶體佈局問題C語言結構體記憶體
- JS解構賦值JS賦值
- c語言中的getchar()和EOFC語言
- C 語言中的 sscanf 詳解