Maison > développement back-end > Golang > Comment transmettre des tranches Go aux fonctions C et gérer les modifications du pointeur ?

Comment transmettre des tranches Go aux fonctions C et gérer les modifications du pointeur ?

Barbara Streisand
Libérer: 2024-12-16 18:34:12
original
965 Les gens l'ont consulté

How to Pass Go Slices to C Functions and Handle Pointer Modifications?

Passer des pointeurs vers des tranches vers des fonctions C dans Go

Lors de l'appel de fonctions C depuis Go à l'aide de cgo, il peut être difficile de transmettre des pointeurs vers tranches. Considérons une fonction C comme :

int f(int *count, char ***strs);
Copier après la connexion

où count est la longueur du tableau strs, strs est un tableau de chaînes et la valeur de retour indique un statut d'erreur.

Dans Go, on pourrait initialement tenter de transmettre count et strs comme suit :

C.f((*C.int)(&count), (**C.char)(&strs[0]))
Copier après la connexion

Cependant, cela ne permettra pas de modifier les strs en C. Pour activer cela, il est nécessaire pour allouer le tableau en C. Semblable à C.CString, il est essentiel de savoir où libérer le tableau externe, en particulier lorsque la fonction C alloue potentiellement un nouveau tableau.

Le code ci-dessous montre comment allouer le tableau C :

cArray := C.malloc(C.size_t(c_count) * C.size_t(unsafe.Sizeof(uintptr(0))))

// Convert the C array to a Go array for indexing
a := (*[1<<30 - 1]*C.char)(cArray)
for index, value := range strs {
    a[index] = C.CString(value)
}

err := C.f(&c_count, (***C.char)(unsafe.Pointer(&cArray)))
Copier après la connexion

Dans ce code, cArray est alloué en C, a est un wrapper de tranche autour de ce tableau pour permettre l'indexation, et chaque chaîne est copié dans la mémoire C. La fonction f peut désormais modifier les chaînes en C et renvoyer la valeur modifiée à Go.

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