Go에서 슬라이스에 대한 포인터를 C 함수에 전달
Go에서 C 함수와 상호작용할 때 일반적인 작업은 복합 함수를 전달하는 것입니다. 슬라이스와 같은 데이터 구조. 그러나 Go 슬라이스와 C 배열에는 특별한 처리가 필요한 근본적인 차이점이 있습니다.
int f(int *count, char ***strs) 시그니처가 있는 다음 C 함수를 고려해 보세요. 여기에는 두 개의 포인터가 필요합니다. count는 문자열 배열의 길이를 가리키고 strs는 문자열 포인터의 배열을 가리킵니다.
Go에서는 슬라이스가 이러한 함수에 직접 전달될 수 없습니다. Go 전용 데이터 구조이며 C 배열과 다릅니다. 또한 Go 슬라이스에는 cgo가 C 함수로 전달하는 것을 금지하는 Go 포인터가 포함되어 있습니다.
이를 극복하려면 C에서 배열을 수동으로 할당하고 외부 배열을 해제할 위치를 추적해야 합니다. . Go 슬라이스의 각 문자열에 대해 C.CString을 사용하여 C 문자열로 변환하고 할당된 C 배열에 해당 C 문자열 포인터를 기록합니다.
다음은 Go 코드의 수정된 버전입니다.
cArray := C.malloc(C.size_t(c_count) * C.size_t(unsafe.Sizeof(uintptr(0)))) // Convert the C array to a Go Array for easy 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)))
이 접근 방식을 사용하면 C 함수가 조작 가능한 코드에 액세스할 수 있습니다. C 배열을 사용하면 나중에 사용할 수 있도록 조작된 배열을 다시 Go 슬라이스로 변환할 수 있습니다.
위 내용은 C 문자열 배열에 대한 포인터가 필요한 C 함수에 Go 슬라이스를 어떻게 전달할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!