Heim > Backend-Entwicklung > Golang > Wie übergebe ich Go-Slices an C-Funktionen und behandle Zeigeränderungen?

Wie übergebe ich Go-Slices an C-Funktionen und behandle Zeigeränderungen?

Barbara Streisand
Freigeben: 2024-12-16 18:34:12
Original
957 Leute haben es durchsucht

How to Pass Go Slices to C Functions and Handle Pointer Modifications?

Zeiger auf Slices an C-Funktionen in Go übergeben

Beim Aufrufen von C-Funktionen aus Go mit cgo kann es schwierig sein, Zeiger an diese zu übergeben Scheiben. Betrachten Sie eine C-Funktion wie:

int f(int *count, char ***strs);
Nach dem Login kopieren

wobei count die Länge des strs-Arrays ist, strs ein Array von Strings ist und der Rückgabewert einen Fehlerstatus angibt.

In Go, man könnte zunächst versuchen, count und strs wie folgt zu übergeben:

C.f((*C.int)(&count), (**C.char)(&strs[0]))
Nach dem Login kopieren

Dadurch sind jedoch keine Änderungen an strs in C möglich. Um dies zu ermöglichen, ist es erforderlich, um das Array in C zuzuweisen. Ähnlich wie bei C.CString ist es wichtig, den Überblick darüber zu behalten, wo das äußere Array freigegeben werden soll, insbesondere wenn die C-Funktion möglicherweise ein neues Array zuweist.

Der folgende Code zeigt, wie das geht Ordnen Sie das C-Array zu:

cArray := C.malloc(C.size_t(c_count) * C.size_t(unsafe.Sizeof(uintptr(0))))

// Convert the C array to a Go array for indexing
a := (*[1<<30 - 1]*C.char)(cArray)
for index, value := range strs {
    a[index] = C.CString(value)
}

err := C.f(&c_count, (***C.char)(unsafe.Pointer(&cArray)))
Nach dem Login kopieren

In diesem Code wird cArray in C zugewiesen, a ist ein Slice-Wrapper um dieses Array, um die Indizierung zu ermöglichen, und jede Zeichenfolge wird kopiert in den C-Speicher. Die Funktion f kann nun Zeichenfolgen in C ändern und den geänderten Wert an Go zurückgeben.

Das obige ist der detaillierte Inhalt vonWie übergebe ich Go-Slices an C-Funktionen und behandle Zeigeränderungen?. 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