1 回答

TA貢獻(xiàn)1906條經(jīng)驗 獲得超10個贊
您的問題中沒有足夠的信息來完全回答它,因為我們不知道——C 語言本身并沒有告訴我們——它void **是如何使用的。您的評論和附加代碼(非常強(qiáng)烈地)表明它的使用方式是receive填充指針:
int receive(void **data) {
*data = <something>;
return <some value>;
}
我們不知道尖括號的部分;要使用 C 代碼中的這些數(shù)據(jù),我們會按照您所說的做:
void f(void) {
void *p;
int ret;
...
ret = receive(&p);
}
鑒于這么多和(合理的)假設(shè),我們不知道的是:
ret
值說明什么?p
之后總是有效嗎?可以訪問多少字節(jié)
*p
?
例如,將:
struct our_data dst;
memcpy(&dst, p, len);
p是從數(shù)據(jù)結(jié)構(gòu)中獲取字節(jié)的有效方法dst,如果是這樣,長度len從何而來?它是否暗示,例如,我們是否知道因為retwas not -1(error)p是有效的并且有sizeof(struct our_data)可用的字節(jié),我們需要 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()
盡管可能(取決于任務(wù)等)為原始數(shù)據(jù)編寫一個反序列化器更有意義,我們將其作為一個存在于 C 內(nèi)存中的數(shù)組獲得;
- 1 回答
- 0 關(guān)注
- 79 瀏覽
添加回答
舉報