首頁 > 後端開發 > Golang > 如何呼叫修改go記憶體的C函數?

如何呼叫修改go記憶體的C函數?

WBOY
發布: 2024-02-05 22:36:03
轉載
1232 人瀏覽過

如何呼叫修改go記憶體的C函數?

問題內容

假設我有一個有簽名的 C 函數

// myclib.h

void modify(double* ptr, int N);
登入後複製

這會改變參數指標 ptr 指向的記憶體。

以下程式碼對於 Go 的垃圾收集器來說是否安全?是否需要 runtimer.Pinner

package main

// #cgo CFLAGS: -g -Wall
// #include "myclib.h"
import "C"
import (
    "fmt"
    "runtime"
)

func modifyWrapper(v []float64) {
    ptr := (*C.double)(&v[0])
    N := (C.int)(len(v))

    pinner := runtime.Pinner{}
    pinner.Pin(ptr)
    C.modify(ptr, N)
    pinner.Unpin()
}

func main() {
    v := []float64{9.0, 2.0, 1.0, 4.0, 5.0}
    modifyWrapper(v)
}
登入後複製


正確答案


<小时/>#
package main

/*
#cgo CFLAGS: -g -Wall
#include <stdio.h>
void modify(double* ptr, int N) {
    if (!ptr || N <= 0) {
        return;
    }
    printf("modify: %g %d\n", *ptr, N);
    *ptr = 42;
    printf("modify: %g %d\n", *ptr, N);
}
*/
import "C"

import (
    "fmt"
    "unsafe"
)

func modify(v []float64) {
    ptr := (*C.double)(unsafe.SliceData(v))
    N := (C.int)(len(v))
    C.modify(ptr, N)
}

func main() {
    v := []float64{9.0, 2.0, 1.0, 4.0, 5.0}
    fmt.Println(v)
    modify(v)
    fmt.Println(v)
}
登入後複製
<小时/>
[9 2 1 4 5]
modify: 9 5
modify: 42 5
[42 2 1 4 5]
登入後複製

以上是如何呼叫修改go記憶體的C函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板