Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Menghantar Go Slice ke Fungsi C yang Mengubah Penunjuk kepada Penunjuk kepada Susunan Rentetan?

Bagaimana untuk Menghantar Go Slice ke Fungsi C yang Mengubah Penunjuk kepada Penunjuk kepada Susunan Rentetan?

Mary-Kate Olsen
Lepaskan: 2024-12-07 15:05:13
asal
542 orang telah melayarinya

How to Pass a Go Slice to a C Function that Modifies a Pointer to a Pointer to an Array of Strings?

Melalukan Penunjuk ke Slice ke Fungsi C dalam Go

Masalah

Apabila memanggil fungsi C yang mengharapkan penuding kepada penuding ke tatasusunan rentetan, bagaimana ini boleh dicapai dalam Go sambil membenarkan fungsi C mengubah suai rentetan tatasusunan?

Penyelesaian

Membuat kepingan dalam Go dan menghantarnya terus ke fungsi C tidak mungkin disebabkan oleh perbezaan dalam struktur data dan peruntukan memori. Sebaliknya, adalah perlu untuk memperuntukkan tatasusunan dalam C.

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

// Convert C array to Go array
a := (*[1<<30 - 1]*C.char)(cArray)

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

// Call C function with pointer to array pointer
err := C.f(&c_count, (***C.char)(unsafe.Pointer(&cArray)))
Salin selepas log masuk

Dengan memperuntukkan tatasusunan dalam C, ia membenarkan fungsi C mengubah suai dan mengubah saiz tatasusunan. Perubahan yang dibuat dalam C akan ditunjukkan dalam kepingan Go selepas fungsi C kembali.

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

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