Maison >développement back-end >Golang >Comment accéder en toute sécurité à un tableau de caractères C dans Go à l'aide de cgo ?

Comment accéder en toute sécurité à un tableau de caractères C dans Go à l'aide de cgo ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-18 07:12:02828parcourir

How to Safely Access a C Char Array in Go using cgo?

Accès à C Char Array dans Go avec cgo

En C, nous rencontrons souvent des tableaux de pointeurs de caractères constants (par exemple, const char *myStringArray []). Accéder à de tels tableaux depuis Go à l'aide de cgo peut s'avérer difficile.

Approche incorrecte :

Au départ, vous pouvez tenter d'indexer le tableau directement en utilisant une arithmétique de pointeur non sécurisée :

myGoString := C.GoString((*C.char) (unsafe.Pointer(uintptr(unsafe.Pointer(C.myStringArray)) + uintptr(index) * unsafe.Sizeof(C.myStringArray))))

Cependant, cette approche naviguera dans les caractères d'une chaîne, pas dans le tableau lui-même.

Solution correcte :

Une solution plus fiable implique la conversion le tableau C dans une tranche Go.

// Define array size
arraySize := 3

// Create Go slice
cStrings := (*[1 << 30]*C.char)(unsafe.Pointer(&C.myStringArray))[:arraySize:arraySize]

// Iterate over slice
for _, cString := range cStrings {
    fmt.Println(C.GoString(cString))
}

Cette approche garantit une indexation appropriée du tableau, donnant accès à chaque élément de chaîne dans son intégralité.

En comprenant les subtilités de la manipulation du pointeur et l'utilité des tranches Go, vous pouvez combler efficacement le fossé entre les structures de mémoire C et 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!

Déclaration:
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