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