> 백엔드 개발 > Golang > C 문자열 배열에 대한 포인터가 필요한 C 함수에 Go 슬라이스를 어떻게 전달할 수 있나요?

C 문자열 배열에 대한 포인터가 필요한 C 함수에 Go 슬라이스를 어떻게 전달할 수 있나요?

DDD
풀어 주다: 2024-12-11 10:20:16
원래의
232명이 탐색했습니다.

How Can I Pass a Go Slice to a C Function That Expects a Pointer to an Array of C Strings?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿