> 백엔드 개발 > Golang > Go 슬라이스 포인터를 C 함수에 전달하는 방법은 무엇입니까?

Go 슬라이스 포인터를 C 함수에 전달하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2024-12-05 13:41:11
원래의
663명이 탐색했습니다.

How to Pass a Go Slice Pointer to a C Function?

Go에서 슬라이스에 대한 포인터를 C 함수에 전달

cgo를 사용하여 Go에서 C 함수를 호출할 때 포인터를 Go 슬라이스에 인수로 전달해야 하는 경우가 많습니다. 그러나 Go 슬라이스는 C 배열과 직접 호환되지 않기 때문에 이는 어려울 수 있습니다.

이 문제를 해결하려면 C 메모리에 배열을 할당하고 해당 배열에 대한 포인터를 C 함수에 전달해야 합니다. 이렇게 하면 C 함수가 배열을 수정하고 이를 다시 Go로 반환할 수 있습니다.

다음은 C에서 배열을 할당하고 Go 슬라이스에서 배열에 포인터를 전달하는 방법을 보여주는 예입니다.

// C function signature: int f(int *count, char ***strs)
import "C"

func go_f(strs []string) int {
    count := len(strs)
    c_count := C.int(count)

    // Allocate an array in C memory to store the strings
    cArray := C.malloc(C.size_t(c_count) * C.size_t(unsafe.Sizeof(uintptr(0))))

    // Convert the C array to a Go array so we can access its elements
    a := (*[1<<30 - 1]*C.char)(cArray)

    // Copy the Go strings into the C array
    for index, value := range strs {
        a[index] = C.CString(value)
    }

    // Call the C function with a pointer to the C array
    err := C.f(&c_count, (***C.char)(unsafe.Pointer(&cArray)))

    // Free the C array
    C.free(cArray)

    return int(err)
}
로그인 후 복사

C 메모리에 배열을 할당함으로써 C 함수는 내용을 수정할 수 있으며 C 함수가 반환될 때 변경 사항이 Go 슬라이스로 다시 전파됩니다.

위 내용은 Go 슬라이스 포인터를 C 함수에 전달하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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