看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) gcc, linux 問題(Question): 在底下 srt 結構, 有辦法不指定 struct member 而直接靠記憶體操作 struct member 嗎(ex: address + 1)? 會這麼問的原因是 &cat + 1 跳到的下一個位置會是往後跳 sizeof(int) * 5, 這樣一來就無法完成我要的結果. 目前本身的看法, 猜測 struct 本身就不建議這樣操作, 或者相同 type 要這樣操作就改用 array. 不知道大家有沒有什麼看法, 感謝. 程式碼(Code):(請善用置底文網頁, 記得排版) #include <stdio.h> #include <string.h> struct srt { int a; int b; int c; int d; int e; }; int main () { struct srt cat ; int i = 0; int tmp = 99; for (; sizeof(struct srt)/sizeof(int); ++i) memcpy(..., &tmp, sizeof(int)); return 0; } 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.235.150
diabloevagto:-> 11/08 23:28
diabloevagto:搞錯意思了...請忽略推文 11/08 23:29
tropical72:是有什麼不得已的苦衷要做這事嗎?做出來相容性不佳。 11/08 23:44
tropical72:http://codepad.org/Oe29maRN 如果成員size非一致會錯. 11/08 23:56
dk3208:可以用offsetof 11/09 00:18
dk3208:想了一下跟你的需求好像不太一樣...orz 11/09 00:19
VictorTom:硬幹就是&cat後先cast成char*再加offset, 不過大概很可 11/09 01:03
VictorTom:能會撞到一些意外....@_@" 11/09 01:04
justinC:我最後的解法 int * ptr = (unsigned long *) &cat; 11/09 12:49
justinC:再 ptr + i 去走訪 11/09 12:50
littleshan:為什麼你能想出一個和板友建議完全不一樣的解法... 11/09 15:42
angleevil:而且此寫法,為什麼覺得屬於不可能的.5*sizeof(int)不等 11/09 15:46
angleevil:於int吧 11/09 15:47
justinC:sorry, 上述 for 的條件有誤, 應為 i < sizeof(xxx/yyy) 11/09 21:27
justinC:我的解法應該就跟 VictorTom 板友一樣 11/09 21:28
justinC:也想過會不會碰到額外問題, 不過暫時想不到 11/09 21:29
justinC:至於 angleevil 板友的建議, 有點看不懂意思 @@ 11/09 21:30
tropical72:額外的問題指的應是 1. 資料型態不一時,padding 問題 11/09 21:37
tropical72:2. little endian 調整, 要通用的話就不能用 memcpy. 11/09 21:38
justinC:第二點有點不懂 .. 11/09 22:06
x000032001:查little endian就知道了 不然白算盤應該也有說明 11/09 22:11
x000032001:little endian 跟 big endian是啥 11/09 22:11
firejox:樓上上下推有點矛盾... 11/09 22:14
tropical72:http://codepad.org/oxGLfHAI 觀查一下有什麼現象,不熟 11/09 22:18
tropical72:的話建議放棄你目前想做的這件事.埋地雷可能性極高。 11/09 22:18
VictorTom:f板友一定是誤會x板友的推文了, 要把兩行連在一起看啊XD 11/09 22:32
justinC:恩, 我知道 little endian 儲存的方式, 單就相同 type 11/09 22:35
justinC:存取(memcpy, printf), 結果應該是正確. 相同 type 的東西 11/09 22:36
justinC:考慮用 struct 是因為可以讓 member 具有可讀性 11/09 22:36
justinC:不過看來大家不建議這樣做, 我會改用 array 取代之 11/09 22:36
x000032001:因為推不下 把英文單字推在一起閱讀上比較方便 11/09 22:49
angleevil:justinC 我的意思是sizeof(cat) = 5*sizeof(int) 11/09 23:11
angleevil:即使你用int * ptr = (unsigned long *) &cat 11/09 23:11
angleevil:ptr + i去走訪,一次位移也是sizeof(int). 11/09 23:13
angleevil:但是sizeof(unsigned long)為sizeof(int)*2 11/09 23:18
angleevil:怎樣都是錯吧.即使我不是很會alignment問題,也有這感覺 11/09 23:18
justinC:to angleevil: 筆誤筆誤 .. 11/09 23:30