[問題] 走訪 struct member 的問題

看板C_and_CPP作者 (無)時間12年前 (2011/11/08 23:25), 編輯推噓3(3034)
留言37則, 9人參與, 最新討論串1/2 (看更多)
開發平台(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

11/08 23:28, , 1F
->
11/08 23:28, 1F

11/08 23:29, , 2F
搞錯意思了...請忽略推文
11/08 23:29, 2F

11/08 23:44, , 3F
是有什麼不得已的苦衷要做這事嗎?做出來相容性不佳。
11/08 23:44, 3F

11/08 23:56, , 4F
http://codepad.org/Oe29maRN 如果成員size非一致會錯.
11/08 23:56, 4F

11/09 00:18, , 5F
可以用offsetof
11/09 00:18, 5F

11/09 00:19, , 6F
想了一下跟你的需求好像不太一樣...orz
11/09 00:19, 6F

11/09 01:03, , 7F
硬幹就是&cat後先cast成char*再加offset, 不過大概很可
11/09 01:03, 7F

11/09 01:04, , 8F
能會撞到一些意外....@_@"
11/09 01:04, 8F

11/09 12:49, , 9F
我最後的解法 int * ptr = (unsigned long *) &cat;
11/09 12:49, 9F

11/09 12:50, , 10F
再 ptr + i 去走訪
11/09 12:50, 10F

11/09 15:42, , 11F
為什麼你能想出一個和板友建議完全不一樣的解法...
11/09 15:42, 11F

11/09 15:46, , 12F
而且此寫法,為什麼覺得屬於不可能的.5*sizeof(int)不等
11/09 15:46, 12F

11/09 15:47, , 13F
於int吧
11/09 15:47, 13F

11/09 21:27, , 14F
sorry, 上述 for 的條件有誤, 應為 i < sizeof(xxx/yyy)
11/09 21:27, 14F

11/09 21:28, , 15F
我的解法應該就跟 VictorTom 板友一樣
11/09 21:28, 15F

11/09 21:29, , 16F
也想過會不會碰到額外問題, 不過暫時想不到
11/09 21:29, 16F

11/09 21:30, , 17F
至於 angleevil 板友的建議, 有點看不懂意思 @@
11/09 21:30, 17F

11/09 21:37, , 18F
額外的問題指的應是 1. 資料型態不一時,padding 問題
11/09 21:37, 18F

11/09 21:38, , 19F
2. little endian 調整, 要通用的話就不能用 memcpy.
11/09 21:38, 19F

11/09 22:06, , 20F
第二點有點不懂 ..
11/09 22:06, 20F

11/09 22:11, , 21F
查little endian就知道了 不然白算盤應該也有說明
11/09 22:11, 21F

11/09 22:11, , 22F
little endian 跟 big endian是啥
11/09 22:11, 22F

11/09 22:14, , 23F
樓上上下推有點矛盾...
11/09 22:14, 23F

11/09 22:18, , 24F
http://codepad.org/oxGLfHAI 觀查一下有什麼現象,不熟
11/09 22:18, 24F

11/09 22:18, , 25F
的話建議放棄你目前想做的這件事.埋地雷可能性極高。
11/09 22:18, 25F

11/09 22:32, , 26F
f板友一定是誤會x板友的推文了, 要把兩行連在一起看啊XD
11/09 22:32, 26F

11/09 22:35, , 27F
恩, 我知道 little endian 儲存的方式, 單就相同 type
11/09 22:35, 27F

11/09 22:36, , 28F
存取(memcpy, printf), 結果應該是正確. 相同 type 的東西
11/09 22:36, 28F

11/09 22:36, , 29F
考慮用 struct 是因為可以讓 member 具有可讀性
11/09 22:36, 29F

11/09 22:36, , 30F
不過看來大家不建議這樣做, 我會改用 array 取代之
11/09 22:36, 30F

11/09 22:49, , 31F
因為推不下 把英文單字推在一起閱讀上比較方便
11/09 22:49, 31F

11/09 23:11, , 32F
justinC 我的意思是sizeof(cat) = 5*sizeof(int)
11/09 23:11, 32F

11/09 23:11, , 33F
即使你用int * ptr = (unsigned long *) &cat
11/09 23:11, 33F

11/09 23:13, , 34F
ptr + i去走訪,一次位移也是sizeof(int).
11/09 23:13, 34F

11/09 23:18, , 35F
但是sizeof(unsigned long)為sizeof(int)*2
11/09 23:18, 35F

11/09 23:18, , 36F
怎樣都是錯吧.即使我不是很會alignment問題,也有這感覺
11/09 23:18, 36F

11/09 23:30, , 37F
to angleevil: 筆誤筆誤 ..
11/09 23:30, 37F
文章代碼(AID): #1EkKdjfo (C_and_CPP)
文章代碼(AID): #1EkKdjfo (C_and_CPP)