使用 CGO 将 Go 嵌套结构数组转换为 C?
Translate a Go nested array of struct to C using CGO?
我正在尝试在 Go 中创建一个结构,其中一个子结构是一个结构数组,然后使用 CGO 将其转换为 C。
我在 Go 中尝试过类似的东西
*/
typedef struct FileInfo{
int64_t Size;
char *Name;
}FileInfo;
typedef struct Result{
FileInfo **files;
}Result;
int64_t GetResult(void **presult, FileInfo **files) {
Result *result = (Result *)malloc(sizeof(Result));
result->files=files;
*presult = result;
int64_t ptr = (int64_t)result;
return ptr;
}
*/
import "C"
func Run() {
var arr []*C.struct_FileInfo
ai := C.struct_FileInfo{
Size: C.int64_t(1234),
Name: C.CString("some name"),
}
arr = append(arr, &ai)
var presult unsafe.Pointer
ptr := C.GetResult(&presult, &arr[0])
println("\nResult struct pointer: %v", ptr)
}
它引发了 panic: runtime error: cgo argument has Go pointer to Go pointer
错误。
如何修复此错误?
更新:
问题
arr
是一片指针 (*C.struct_FileInfo
)。
&arr[0]
获取该切片的第一个元素(指向)的地址。
ai
变量的地址成为arr
的第一个元素,由Go分配。
因此:
arr[0]
包含&ai
,这是Go分配的指向C.struct_FileInfo
的指针。
arr
也由 Go 管理,因此 &arr[0]
是“指向 Go 指针的 Go 指针”。
请仔细阅读this。
可能的解决方案
一个解决方案是调用C.malloc
分配足够的字节来存储C.struct_FileInfo
。这样,您将拥有指向 C 指针的 Go 指针 (&arr[0]),这很好。
不要忘记 C.free
完成该记忆后。
我正在尝试在 Go 中创建一个结构,其中一个子结构是一个结构数组,然后使用 CGO 将其转换为 C。
我在 Go 中尝试过类似的东西
*/
typedef struct FileInfo{
int64_t Size;
char *Name;
}FileInfo;
typedef struct Result{
FileInfo **files;
}Result;
int64_t GetResult(void **presult, FileInfo **files) {
Result *result = (Result *)malloc(sizeof(Result));
result->files=files;
*presult = result;
int64_t ptr = (int64_t)result;
return ptr;
}
*/
import "C"
func Run() {
var arr []*C.struct_FileInfo
ai := C.struct_FileInfo{
Size: C.int64_t(1234),
Name: C.CString("some name"),
}
arr = append(arr, &ai)
var presult unsafe.Pointer
ptr := C.GetResult(&presult, &arr[0])
println("\nResult struct pointer: %v", ptr)
}
它引发了 panic: runtime error: cgo argument has Go pointer to Go pointer
错误。
如何修复此错误?
更新:
问题
arr
是一片指针 (*C.struct_FileInfo
)。&arr[0]
获取该切片的第一个元素(指向)的地址。ai
变量的地址成为arr
的第一个元素,由Go分配。
因此:
arr[0]
包含&ai
,这是Go分配的指向C.struct_FileInfo
的指针。arr
也由 Go 管理,因此&arr[0]
是“指向 Go 指针的 Go 指针”。
请仔细阅读this。
可能的解决方案
一个解决方案是调用C.malloc
分配足够的字节来存储C.struct_FileInfo
。这样,您将拥有指向 C 指针的 Go 指针 (&arr[0]),这很好。
不要忘记 C.free
完成该记忆后。