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
495 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!

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