Maison > développement back-end > Golang > Comment passer un pointeur Go Slice à une fonction C ?

Comment passer un pointeur Go Slice à une fonction C ?

Linda Hamilton
Libérer: 2024-12-05 13:41:11
original
662 Les gens l'ont consulté

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

Passer un pointeur vers une tranche vers une fonction C dans Go

Lors de l'appel de fonctions C depuis Go à l'aide de cgo, il est souvent nécessaire de passer des pointeurs vers des tranches Go comme arguments. Cependant, cela peut être difficile car les tranches Go ne sont pas directement compatibles avec les tableaux C.

Pour résoudre ce problème, il est nécessaire d'allouer le tableau en mémoire C et de transmettre un pointeur vers ce tableau à la fonction C. Cela garantit que la fonction C peut modifier le tableau et le renvoyer à Go.

Voici un exemple qui montre comment allouer un tableau en C et lui passer un pointeur à partir d'une tranche 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)
}
Copier après la connexion

En allouant le tableau en mémoire C, la fonction C peut modifier son contenu et les modifications seront propagées à la tranche Go lorsque la fonction C revient.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal