第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

如何讓 void** 成為 C 庫的參數(shù)?

如何讓 void** 成為 C 庫的參數(shù)?

Go
偶然的你 2022-10-24 09:06:38
我正在嘗試使用 cgo 從 GO 調(diào)用 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 調(diào)用此函數(shù)?Go 不分配任何內(nèi)存,內(nèi)存地址通過它返回myptr并直接從中訪問。receive()是“無副本”并將實際數(shù)據(jù)的地址寫入myptr. 然后使用 訪問數(shù)據(jù)*(char*)myptr。我們可以假設(shè)receive()分配和釋放緩沖區(qū),它對 lib 的用戶隱藏理想情況下,我會通過[]bytein go 讀取數(shù)據(jù)。
查看完整描述

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ù)組獲得;

查看完整回答
反對 回復(fù) 2022-10-24
  • 1 回答
  • 0 關(guān)注
  • 79 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號