c語言中,結構使用是非常頻繁的,操作結構體時,我們一般使用memcpy對結構體進行copy賦值,其實我們忽略了一點,同一種型別結構體是可以直接進行賦值的。另外,本文介紹下使用memcpy copy結構體時的一些注意事項。
使用memcpy對結構體進行記憶體copy,首先要知道結構體的大小計算,最簡單的方法使用sizeof(結構體型別)進行計算。當然,本文也介紹下結構體所佔空間大小計算方法。
主要有兩原則:
1.對結構體成員進行儲存時,要以自身為起始位址(相對位址),每個成員存放到位址要是自身大小的整數倍。
例如:(4+4+8)
#includetypedef struct test
test_t;
int main(int argc, const char *ar**)
2.計算出來的結構體總大小要為其成員最大寬度的整數倍
例如:(8+8+8)
#include#include#include//無指標結構體
typedef struct test
test_t;
//有指標結構體
typedef struct tests
tests_t;
//結構體成員定義存在差異
typedef struct testn
testn_t;
int main(int argc, const char *ar**)
編譯執行:
測試一:
對於同一種型別的結構體,記憶體拷貝與結構體直接賦值是等價的,至少在本例中等價。
測試二:
如果結構體中存在指標變數,其大小就是四個位元組,並不影響結構體直接賦值或者使用memcpy。
測試三:
對於不同型別的結構體進行拷貝,會出現什麼問題。
現在有test_t,testn_t兩種型別的結構體,從log看test_t 佔24個位元組,testn_t佔28個位元組大小,實際計算也是如此。現在將test_t型別的結構體copy到testn_t型別的結構體,會出現什麼結果。
由上圖可以看出,直接記憶體拷貝。
由測試三最後一條log,可以看出,與上圖是對應的,至於字串列印沒變,是因為%s列印遇到』\0』結束,我們也可以做個測試。
#includeint main(int argc, const char *ar**)
編譯執行
結構體問題
1.首先構建乙個結構體 typedef struct num 2.然後使用該結構體進行定義 1.指標定義 num i num malloc sizeof num 5 if i exit 1 2.非指標定義 num j 5 3.我認為輸出的val值應該都為0,因為建立結構體時就給val賦值,但是結果卻...
結構體 結構體變數 結構體指標的基本問題
注意 以下都是32位的系統 一 結構體定義 第乙個問題 下面兩個 struct human struct human 這兩個結構體是否相同?答案 不一樣 原因 根據c語言結構體的機制,我們為結構體變數分配乙個連續空間時,總是以結構體中最大位元組長度型別的整數倍分配。第乙個的記憶體分布圖 length...
結構體對齊問題
1,比如 structa structb sizeof a 6,sizeof b 8,為什麼?注 sizeof short 2,sizeof long 4 因為 成員對齊有乙個重要的條件,即每個成員按自己的方式對齊.其對齊的規則是,每個成員按其型別的對齊引數 通常是這個型別的大小 和指定對齊引數 這...