Maison > développement back-end > Golang > Comment passer une Go Slice à une fonction C qui modifie un pointeur vers un pointeur vers un tableau de chaînes ?

Comment passer une Go Slice à une fonction C qui modifie un pointeur vers un pointeur vers un tableau de chaînes ?

Mary-Kate Olsen
Libérer: 2024-12-07 15:05:13
original
495 Les gens l'ont consulté

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

Passer un pointeur vers Slice vers une fonction C dans Go

Problème

Lors de l'appel d'une fonction C qui attend un pointeur vers un pointeur vers un tableau de chaînes, comment cela peut-il être réalisé dans Go tout en permettant également à la fonction C de modifier la chaîne array?

Solution

Créer une tranche dans Go et la transmettre directement à une fonction C n'est pas possible en raison des différences dans les structures de données et l'allocation de mémoire. Au lieu de cela, il est nécessaire d'allouer le tableau en 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)))
Copier après la connexion

En allouant le tableau en C, cela permet à la fonction C de modifier et de redimensionner le tableau. Les modifications apportées en C seront reflétées dans la tranche Go après le retour de la fonction C.

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