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

作者: ando5566 (風雲變色)   2022-06-15 18:00:42
開發平台(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):
作者: LPH66 (-6.2598534e+18f)   2022-06-15 18:58:00
來跟我說一次: 「陣列不等於指標」所以你在 getDataFun() 這裡把一個不相容的結構傳進去了你可能需要釐清一下到底 _USE 結構是要怎麼用應該不會是像你這樣硬傳進去
作者: chaos1993 (棧前小二)   2022-06-16 00:26:00
看完的理解是getDataFunc(&obj) 將obj.usedata紀錄globaldata[0]的記憶體位置,所以step1才取值拿到globaldata[0]位置並assign給char*但這種不相容strict可以過..?compiler相對不嚴謹嗎更正struct
作者: god145145   2022-06-16 09:16:00
PIC用XC8比較多,你要不要換一下
作者: Lipraxde (Lipraxde)   2022-06-16 10:37:00
他是用 XC8 吧 XD?
作者: ando5566 (風雲變色)   2022-06-16 14:02:00
是XC8沒錯 抱歉打反了
作者: OnlyRD (里巷人)   2022-06-16 20:18:00
你根本沒有拷貝陣列吧?只是破壞了原本的struct的佔一個pointer的記憶體。喔喔你是要複製資料到global的array去嗎?這寫法實在難不出有什麼理由要這樣做,感覺像故意隱藏起來,也許是checksum還是防偽防盜版?不懂。但這段code看起來挺危險,不過如果字節對齊沒問題,應該可以動作,但不知道compiler有沒有一些奇奇怪怪的編譯設定要注意。
作者: sarafciel (Cattuz)   2022-06-17 02:09:00
媽呀我看了20分鐘才看懂這段code到底想幹嘛= =https://godbolt.org/z/MM7fY5dPc 這樣應該好懂一些我沒用過這顆compiler 但應該不至於連union都不支援..?
作者: CoNsTaR ((const *))   2022-06-17 07:55:00
疊床架屋下的產物吧這段 code 的問題應該只有把 MSG_OBJ_USE* 當作 MSG_OBJ*用而已,其他看起來沒問題吧
作者: Lipraxde (Lipraxde)   2022-06-17 10:27:00
C 的 symbol 沒有 mangling,變數變成用不同 type 去解讀的失誤也很容易發生,說不定也是他這個 obj 能這樣傳的原因XD
作者: OnlyRD (里巷人)   2022-06-17 17:43:00
以前看過類似的東西,叫做GObject,但他是為了提供ABI級的相容性(沒記錯的話),還有訊號、物件等等,但用GObject寫程式無敵痛苦,寫過一次就希望以後都不要碰到了,一堆代碼重複的功夫。

Links booklink

Contact Us: admin [ a t ] ucptt.com