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!