Heim >Backend-Entwicklung >Golang >Wie übergebe ich einen Go-Slice-Zeiger an eine C-Funktion?

Wie übergebe ich einen Go-Slice-Zeiger an eine C-Funktion?

Linda Hamilton
Linda HamiltonOriginal
2024-12-05 13:41:11669Durchsuche

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

Zeiger auf Slice an C-Funktion in Go übergeben

Beim Aufrufen von C-Funktionen aus Go mit cgo ist es oft notwendig, Zeiger auf Go-Slices als Argumente zu übergeben. Dies kann jedoch eine Herausforderung darstellen, da Go-Slices nicht direkt mit C-Arrays kompatibel sind.

Um dieses Problem zu beheben, ist es notwendig, das Array im C-Speicher zuzuweisen und einen Zeiger auf dieses Array an die C-Funktion zu übergeben. Dadurch wird sichergestellt, dass die C-Funktion das Array ändern und an Go zurückgeben kann.

Hier ist ein Beispiel, das zeigt, wie man ein Array in C zuordnet und einen Zeiger darauf von einem Go-Slice übergibt:

// 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)
}

Durch die Zuweisung des Arrays im C-Speicher kann die C-Funktion seinen Inhalt ändern und die Änderungen werden zurück an das Go-Slice weitergegeben, wenn die C-Funktion zurückkehrt.

Das obige ist der detaillierte Inhalt vonWie übergebe ich einen Go-Slice-Zeiger an eine C-Funktion?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn