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

Wie kann ich ein Go-Slice an eine C-Funktion übergeben, die einen Zeiger auf ein Array von C-Strings erwartet?

DDD
Freigeben: 2024-12-11 10:20:16
Original
232 Leute haben es durchsucht

How Can I Pass a Go Slice to a C Function That Expects a Pointer to an Array of C Strings?

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

In Go ist die Übergabe komplexer Aufgaben eine häufige Aufgabe bei der Interaktion mit C-Funktionen Datenstrukturen wie Slices. Go-Slices und C-Arrays weisen jedoch grundlegende Unterschiede auf, die eine besondere Behandlung erfordern.

Betrachten Sie die folgende C-Funktion mit der Signatur int f(int *count, char ***strs). Es braucht zwei Zeiger: count zeigt auf die Länge eines Arrays von Strings und strs zeigt auf ein Array von String-Zeigern.

In Go können wir ein Slice nicht direkt an eine solche Funktion übergeben, da Slices dies tun eine Go-spezifische Datenstruktur und unterscheiden sich von C-Arrays. Darüber hinaus enthalten Go-Slices einen Go-Zeiger, der cgo die Übergabe an C-Funktionen verbietet.

Um dies zu umgehen, müssen wir das Array in C manuell zuweisen und verfolgen, wo das äußere Array freigegeben werden soll . Für jeden String im Go-Slice konvertieren wir ihn mit C.CString in einen C-String und zeichnen die entsprechenden C-String-Zeiger im zugewiesenen C-Array auf.

Hier ist eine modifizierte Version des Go-Codes:

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

// Convert the C array to a Go Array for easy 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

Dieser Ansatz stellt sicher, dass die C-Funktion Zugriff auf ein manipulierbares C hat Array, während wir das manipulierte Array zur weiteren Verwendung zurück in ein Go-Slice konvertieren können.

Das obige ist der detaillierte Inhalt vonWie kann ich ein Go-Slice an eine C-Funktion übergeben, die einen Zeiger auf ein Array von C-Strings erwartet?. 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage