指針強制轉換僅僅是將地址后的內容按照不同的類型進行變量解釋和讀取埂蕊。(但是如果強制轉換的指針所指向數(shù)據(jù)的字節(jié)數(shù)不一樣实夹,會存在數(shù)據(jù)錯誤。比如:一個指向char型數(shù)據(jù)的指針p粒梦,p指向的內容只有一個字節(jié)亮航,*p是將地址后面的一個字節(jié)的內容按照char進行解讀取匀们;但是如果將其強制轉換成int型指針*pn缴淋,*pn將地址后面的四個字節(jié)的內容按照int進行解讀取,這樣就會多讀了后面的內存泄朴,出現(xiàn)錯誤重抖。
結構體的大小計算和內存對齊
結構體的成員占用不同的存儲空間,當計算結構體占用內存空間時祖灰,并不是簡單的相加钟沛。
偏移量: 結構體變量成員地址和結構體變量地址的差
結構體大小等于最后一個成員的偏移量 加上最后一個成員的大小
實際上,偏移量會被調整局扶,調整規(guī)則如下:
1. 偏移量必須是當前成員大小的整數(shù)倍
2.結構體大小是所有成員大小的整數(shù)倍(各項)
例子 struct a {
int? i, ? ? ?? // 偏移量為 0
char c; ? ? ? ?? // c 的偏移量為4?
int? j}; ? ? ? ? ?? //j 的偏移量為 5 需要調整到 8 才成為 size(j)的整數(shù)倍
size(a) = 4 +1 + 4+3 = 12? 滿足規(guī)則2
例子:
struct st_task{
uint16_t id;
unint32_t value;
uint64_t timestamp;
};
uint64_t a = 0x 00 00 00 00 00? 01 00 01;
memcpy(&task,&a,size0f(uint64_t)
a 在內存的存儲有兩種形態(tài):
1. 大端模式恨统, 低地址高字節(jié)
00 00 00 00 00 01 00 01? 從左到右低地址到高地址
2.小段模式 低地址低字節(jié)
10 00 10 00 00 00 00 00?
st_task 的大小分析
struct st_task{
uint16_t id; ? // 0
unint32_t value; // 2? 但是成員大小為4 , 因此要補充成4偏移量三妈。
uint64_t timestamp; // 4 + size(uint32_t) =8? 偏移量畜埋, 不用修改。
};
8+ 8 = 16 滿足規(guī)則2
在小端模式下畴蒲, id 被賦值為 1000 value 被賦值為 00 00 00 00 ( 10 00? 被跳過了)悠鞍,( 16 - )timestamp 沒被賦值默認為 0 , 使用小端模式存儲的字節(jié)轉換為實際值后模燥,id 變?yōu)?0x0001