[問題] 請教指標操作方式

看板C_and_CPP (C/C++)作者 (販賣夢想的人)時間1年前 (2022/06/15 18:00), 編輯推噓6(6033)
留言39則, 8人參與, 1年前最新討論串1/2 (看更多)
開發平台(Platform): (Ex: Win10, Linux, ...) 單晶片開發 PIC18 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) CX8 compiler 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) None 問題(Question): 關於這段code指標的操作覺得不太正常, 想請教版友幫我確認觀念 程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔) 定義與宣告部分: typdef struct{ int A; char *data; } MSG_OBJ typedef struct{ int B; char useData[8]; } MSG_OBJ_USE char globalData[8] = {0}; void getDataFun(MSG_OBJ* b) { b->data = globalData; } MSG_OBJ_USE obj; 以上是定義與宣告, 接下來呼叫時傳入obj (特別處為obj之type是MSG_OBJ_USE) getDataFun(&obj); 之後這段code執行 //Step.1 char* ptr = (char*)(*(uint16_t*)obj.useData); //平台指標為16 bits //Step.2 for(int i=0;i<8;i++); { obj.useData[i] = ptr[i]; } //問題: Step1.的動作意思是useData array上面放的值是指標, 所以才可以取值(*)給ptr 然後用step2把copy資料. 我的疑問是b->data = globalData應該是把&globalData[0] 指定給b->data而已. 謝謝回答!! 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.231.184.52 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1655287244.A.D2B.html

06/15 18:58, 1年前 , 1F
來跟我說一次: 「陣列不等於指標」
06/15 18:58, 1F

06/15 18:59, 1年前 , 2F
所以你在 getDataFun() 這裡把一個不相容的結構傳進去了
06/15 18:59, 2F

06/15 19:02, 1年前 , 3F
你可能需要釐清一下到底 _USE 結構是要怎麼用
06/15 19:02, 3F

06/15 19:03, 1年前 , 4F
應該不會是像你這樣硬傳進去
06/15 19:03, 4F

06/16 00:26, 1年前 , 5F
看完的理解是getDataFunc(&obj) 將obj.usedata紀錄glo
06/16 00:26, 5F

06/16 00:26, 1年前 , 6F
baldata[0]的記憶體位置,所以step1才取值拿到globald
06/16 00:26, 6F

06/16 00:26, 1年前 , 7F
ata[0]位置並assign給char*
06/16 00:26, 7F

06/16 00:28, 1年前 , 8F
但這種不相容strict可以過..?compiler相對不嚴謹嗎
06/16 00:28, 8F

06/16 00:28, 1年前 , 9F
更正struct
06/16 00:28, 9F

06/16 09:16, 1年前 , 10F
PIC用XC8比較多,你要不要換一下
06/16 09:16, 10F

06/16 10:37, 1年前 , 11F
他是用 XC8 吧 XD?
06/16 10:37, 11F

06/16 14:02, 1年前 , 12F
是XC8沒錯 抱歉打反了
06/16 14:02, 12F

06/16 20:18, 1年前 , 13F
你根本沒有拷貝陣列吧?只是破壞了原本的struct的
06/16 20:18, 13F

06/16 20:18, 1年前 , 14F
佔一個pointer
06/16 20:18, 14F

06/16 20:18, 1年前 , 15F
的記憶體。
06/16 20:18, 15F

06/16 20:30, 1年前 , 16F
喔喔你是要複製資料到global的array去嗎?這寫法
06/16 20:30, 16F

06/16 20:30, 1年前 , 17F
實在難不出有
06/16 20:30, 17F

06/16 20:30, 1年前 , 18F
什麼理由要這樣做,感覺像故意隱藏起來,也許是che
06/16 20:30, 18F

06/16 20:30, 1年前 , 19F
cksum還是防偽
06/16 20:30, 19F

06/16 20:30, 1年前 , 20F
防盜版?不懂。但這段code看起來挺危險,不過如果
06/16 20:30, 20F

06/16 20:30, 1年前 , 21F
字節對齊沒問題
06/16 20:30, 21F

06/16 20:30, 1年前 , 22F
,應該可以動作,但不知道compiler有沒有一些奇奇
06/16 20:30, 22F

06/16 20:30, 1年前 , 23F
怪怪的編譯設定
06/16 20:30, 23F

06/16 20:30, 1年前 , 24F
要注意。
06/16 20:30, 24F

06/17 02:09, 1年前 , 25F
媽呀我看了20分鐘才看懂這段code到底想幹嘛= =
06/17 02:09, 25F

06/17 02:09, 1年前 , 26F
https://godbolt.org/z/MM7fY5dPc 這樣應該好懂一些
06/17 02:09, 26F

06/17 02:12, 1年前 , 27F
我沒用過這顆compiler 但應該不至於連union都不支援..?
06/17 02:12, 27F

06/17 07:55, 1年前 , 28F
疊床架屋下的產物吧
06/17 07:55, 28F

06/17 07:55, 1年前 , 29F
這段 code 的問題應該只有把 MSG_OBJ_USE* 當作 MSG_OBJ*
06/17 07:55, 29F

06/17 07:55, 1年前 , 30F
用而已,其他看起來沒問題吧
06/17 07:55, 30F

06/17 10:27, 1年前 , 31F
C 的 symbol 沒有 mangling,變數變成用不同 type 去解
06/17 10:27, 31F

06/17 10:27, 1年前 , 32F
讀的失誤也很容易發生,說不定也是他這個 obj 能這樣傳
06/17 10:27, 32F

06/17 10:27, 1年前 , 33F
的原因XD
06/17 10:27, 33F

06/17 17:43, 1年前 , 34F
以前看過類似的東西,叫做GObject,但他是為了提供
06/17 17:43, 34F

06/17 17:43, 1年前 , 35F
ABI級的相容性
06/17 17:43, 35F

06/17 17:43, 1年前 , 36F
(沒記錯的話),還有訊號、物件等等,但用GObject寫
06/17 17:43, 36F

06/17 17:43, 1年前 , 37F
程式無敵痛苦
06/17 17:43, 37F

06/17 17:43, 1年前 , 38F
,寫過一次就希望以後都不要碰到了,一堆代碼重複
06/17 17:43, 38F

06/17 17:43, 1年前 , 39F
的功夫。
06/17 17:43, 39F
文章代碼(AID): #1YgQtCqh (C_and_CPP)
文章代碼(AID): #1YgQtCqh (C_and_CPP)