Heim >Backend-Entwicklung >Golang >Wie übergebe ich ein Go-Slice an eine C-Funktion, die einen Zeiger auf einen Zeiger auf ein Array von Strings ändert?

Wie übergebe ich ein Go-Slice an eine C-Funktion, die einen Zeiger auf einen Zeiger auf ein Array von Strings ändert?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-07 15:05:13536Durchsuche

How to Pass a Go Slice to a C Function that Modifies a Pointer to a Pointer to an Array of Strings?

Übergabe eines Zeigers an Slice an eine C-Funktion in Go

Problem

Beim Aufruf einer C-Funktion, die einen Zeiger auf einen Zeiger auf eine erwartet Array von Strings, wie kann dies in Go erreicht werden, während gleichzeitig der C-Funktion ermöglicht wird, den String zu ändern? Array?

Lösung

Das Erstellen eines Slice in Go und die direkte Übergabe an eine C-Funktion ist aufgrund von Unterschieden in den Datenstrukturen und der Speicherzuweisung nicht möglich. Stattdessen ist es notwendig, das Array in C zuzuordnen.

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

// Convert C array to Go array
a := (*[1<<30 - 1]*C.char)(cArray)

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

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

Durch die Zuweisung des Arrays in C kann die C-Funktion das Array ändern und seine Größe ändern. Die in C vorgenommenen Änderungen werden im Go-Slice widergespiegelt, nachdem die C-Funktion zurückkehrt.

Das obige ist der detaillierte Inhalt vonWie übergebe ich ein Go-Slice an eine C-Funktion, die einen Zeiger auf einen Zeiger auf ein Array von Strings ändert?. 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