Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Menghantar Penunjuk Go Slice ke Fungsi C?

Bagaimana untuk Menghantar Penunjuk Go Slice ke Fungsi C?

Linda Hamilton
Lepaskan: 2024-12-05 13:41:11
asal
670 orang telah melayarinya

How to Pass a Go Slice Pointer to a C Function?

Melalukan Penunjuk ke Slice ke Fungsi C dalam Go

Apabila memanggil fungsi C daripada Go menggunakan cgo, selalunya perlu menghantar penunjuk kepada kepingan Go sebagai argumen. Walau bagaimanapun, ini boleh mencabar kerana kepingan Go tidak serasi secara langsung dengan tatasusunan C.

Untuk menangani isu ini, adalah perlu untuk memperuntukkan tatasusunan dalam memori C dan menghantar penuding kepada tatasusunan itu kepada fungsi C. Ini memastikan bahawa fungsi C boleh mengubah suai tatasusunan dan mengembalikannya kembali kepada Go.

Berikut ialah contoh yang menunjukkan cara memperuntukkan tatasusunan dalam C dan menghantar penuding kepadanya daripada kepingan Go:

// C function signature: int f(int *count, char ***strs)
import "C"

func go_f(strs []string) int {
    count := len(strs)
    c_count := C.int(count)

    // Allocate an array in C memory to store the strings
    cArray := C.malloc(C.size_t(c_count) * C.size_t(unsafe.Sizeof(uintptr(0))))

    // Convert the C array to a Go array so we can access its elements
    a := (*[1<<30 - 1]*C.char)(cArray)

    // Copy the Go strings into the C array
    for index, value := range strs {
        a[index] = C.CString(value)
    }

    // Call the C function with a pointer to the C array
    err := C.f(&c_count, (***C.char)(unsafe.Pointer(&cArray)))

    // Free the C array
    C.free(cArray)

    return int(err)
}
Salin selepas log masuk

Dengan memperuntukkan tatasusunan dalam memori C, fungsi C boleh mengubah suai kandungannya dan perubahan akan disebarkan kembali ke kepingan Go apabila fungsi C kembali.

Atas ialah kandungan terperinci Bagaimana untuk Menghantar Penunjuk Go Slice ke Fungsi C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan