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
Freigeben: 2024-12-07 15:05:13
Original
495 Leute haben es durchsucht

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)))
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage