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
Barbara StreisandOriginal
2024-12-16 18:34:12958Durchsuche

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);

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]))

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

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!

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