1
SP_DEVICE_INTERFACE_DETAIL_DATA
是一個可變長度的結構,從包含其大小的字段開始,後跟一個數組(不是指向一個的指針)。如何分配SP_DEVICE_INTERFACE_DETAIL_DATA?
什麼是一種方便的方式來分配這個結構與所需的數組長度?
SP_DEVICE_INTERFACE_DETAIL_DATA
是一個可變長度的結構,從包含其大小的字段開始,後跟一個數組(不是指向一個的指針)。如何分配SP_DEVICE_INTERFACE_DETAIL_DATA?
什麼是一種方便的方式來分配這個結構與所需的數組長度?
我做到了像MSalters建議:
std::vector<char> rawbuf(sizeof (SP_DEVICE_INTERFACE_DETAIL_DATA) + bufferlen);
SP_DEVICE_INTERFACE_DETAIL_DATA* pDIDD =
reinterpret_cast<SP_DEVICE_INTERFACE_DETAIL_DATA*>(&rawbuf[0]);
編輯:
繼Raymond Chen的例子(如討論on his blog),我可以如下分配SP_DEVICE_INTERFACE_DETAIL_DATA
結構:
PSP_DEVICE_INTERFACE_DETAIL_DATA pDIDD =
malloc(FIELD_OFFSET(SP_DEVICE_INTERFACE_DETAIL_DATA,
DevicePath[bufferlen]));
Eh,不,這個'malloc'應該和'free'匹配,但是'std :: unique-ptr'會調用'd elete'。更簡單:'std :: vector rawbuf(sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA)+ bufferlen); SP_DEVICE_INTERFACE_DETAIL_DATA * ptr = reinterpret_cast (&rawbuf [0]);' –
MSalters
@ MSalters:謝謝指出。你可以讓這個答案,然後我可以刪除我的錯誤的職位,並接受你的。 –
該技術提供了所需的緩衝區大小,但問題在於所需的數組長度。實際需要的大小是'FIELD_OFFSET(SP_DEVICE_INTERFACE_DETAIL_DATA,DevicePath [arraysize])'。還要注意'std :: vector'只保證'char'-alignment,這比'SP_DEVICE_INTERFACE_DETAIL_DATA'對齊要弱。您可能會在某些處理器上發生對齊錯誤。 –