結構體copy問題

2021-09-29 03:48:06 字數 1702 閱讀 2189

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 因為 成員對齊有乙個重要的條件,即每個成員按自己的方式對齊.其對齊的規則是,每個成員按其型別的對齊引數 通常是這個型別的大小 和指定對齊引數 這...