亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何讓 void** 成為 C 庫的參數?

如何讓 void** 成為 C 庫的參數?

Go
偶然的你 2022-10-24 09:06:38
我正在嘗試使用 cgo 從 GO 調用 C 庫。C 庫具有以下功能:int receive(void** data);// I'd call it like that:void* myptr; // myptr=nullint nbBytes = receive(&myptr);if (nbBytes==0) { return }// myptr has now an address to a valid buffer that contains nbBytes bytes.// And then casting it with char* to access the data that can be anything. Example:printf("%d", *(char*)myptr);如何receive()從 GO 調用此函數?Go 不分配任何內存,內存地址通過它返回myptr并直接從中訪問。receive()是“無副本”并將實際數據的地址寫入myptr. 然后使用 訪問數據*(char*)myptr。我們可以假設receive()分配和釋放緩沖區,它對 lib 的用戶隱藏理想情況下,我會通過[]bytein go 讀取數據。
查看完整描述

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 內存中的數組獲得;

查看完整回答
反對 回復 2022-10-24
  • 1 回答
  • 0 關注
  • 75 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號