1 回答

TA貢獻1906條經驗 獲得超10個贊
您的問題中沒有足夠的信息來完全回答它,因為我們不知道——C 語言本身并沒有告訴我們——它void **是如何使用的。您的評論和附加代碼(非常強烈地)表明它的使用方式是receive填充指針:
int receive(void **data) {
*data = <something>;
return <some value>;
}
我們不知道尖括號的部分;要使用 C 代碼中的這些數據,我們會按照您所說的做:
void f(void) {
void *p;
int ret;
...
ret = receive(&p);
}
鑒于這么多和(合理的)假設,我們不知道的是:
ret
值說明什么?p
之后總是有效嗎?可以訪問多少字節
*p
?
例如,將:
struct our_data dst;
memcpy(&dst, p, len);
p是從數據結構中獲取字節的有效方法dst,如果是這樣,長度len從何而來?它是否暗示,例如,我們是否知道因為retwas not -1(error)p是有效的并且有sizeof(struct our_data)可用的字節,我們需要 memcpy 來使其正確對齊?
如果我們知道所有這些事情,我們就可以直接從 Go 完成這項工作:
var p unsafe.Pointer
var obj C.struct_our_data
ret := C.receive(&p)
C.memcpy(unsafe.Pointer(&obj), p, len) // or similar with copy()
盡管可能(取決于任務等)為原始數據編寫一個反序列化器更有意義,我們將其作為一個存在于 C 內存中的數組獲得;
- 1 回答
- 0 關注
- 75 瀏覽
添加回答
舉報