看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) gcc 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 程式碼: typedef struct notify_buildreq_tag { u32 id; u32 state;} NOTIFY_BUILDREQ; typedef struct notify_process_buildreq_result_tag { u8 result;} NOTIFY_BUILDREQ_RESULT; typedef struct notify_process_tag { u32 state;} NOTIFY_PROCESS; typedef struct notify_process_result_tag { u8 result; u8 done;} NOTIFY_PROCESS_RESULT; typedef struct notify_data_tag { u8 type; union { NOTIFY_BUILDREQ bldReq; NOTIFY_BUILDREQ_RESULT bldReqResult; NOTIFY_PROCESS process; NOTIFY_PROCESS_RESULT processResult; } u; u32 length; // length of the data that follows uint32 addr_length; char addr[16]; } NOTIFY_DATA; main(){ NOTIFY_DATA * recvNotify; recvNotify = (NOTIFY_DATA *) buf; dprintf("[test2.1] ==> %x\n",(recvNotify)); dprintf("[test2] ==> %x\n",(recvNotify + 0x24)); } 餵入的資料(Input): 預期的正確結果(Expected Output): 倆著應該只差offset 0x24 錯誤結果(Wrong Output): offset 510?? [test2.1] ==> 814361e8 [test2] ==> 814366f8 問題 為什麼兩者的差距不適0x24? 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 211.22.66.242
pico2k:請用char*... 07/21 20:22
tropical72:猜是1個struct佔36bytes. (recvNotify + 0x24) 移了 07/22 03:21
tropical72:36*36=1296 bytes=0x510 bytes 07/22 03:22
Favonia:寫 0x24 和 36 沒有什麼差別。如果 buf 是一個很大的陣列 07/22 04:03
Favonia:則會移至 36 後的項目。但你用 %x 印指標,型態根本不合, 07/22 04:05
Favonia:最後會印出什麼沒有人知道。剛好差 0x510 沒出事算運氣好. 07/22 04:06
Favonia:(如果 buf 很小,則完全要看實作,標準沒有定義。) 07/22 04:07
tropical72:@Favonia: 我只是解釋為什麼是0x510而非0x24 XD. 07/22 09:44
Favonia:@tropical72 我是在跟原 po 解釋應該會怎樣啦 xD 不是你~ 07/22 10:03
Favonia:我覺得他的測試方法本身就有問題了... 07/22 10:04
tropical72:原來如此,誤會一場 XD 07/22 10:08