我有一个新手CGO问题,我想知道是否有人可以帮助我。当在 GODEBUG 设置为 cgocheck=2 的情况下运行时,我的应用程序崩溃,出现以下情况
write of Go pointer 0xc0003b72c0 to non-Go memory 0x7fefa0016810
fatal error: Go pointer stored into non-Go memory
导致问题的代码是
cArray := C.malloc(C.size_t(len(fd.Faces)) * C.size_t(unsafe.Sizeof(uintptr(0))))
defer C.free(unsafe.Pointer(cArray))
a := (*[1<<30 - 1]*C.struct_Box)(cArray)
for index, value := range fd.GetFaceRectangles() {
box := &C.struct_Box{
left: C.int(value.Min.X),
top: C.int(value.Min.Y),
right: C.int(value.Max.X),
bottom: C.int(value.Max.Y),
}
a[index] = box
}
cBoxCount := C.int(len(fd.Faces))
ret := C.facerec_compute_multi(rec.ptr, cImgData, cLen, &a[0], cBoxCount)
具体到这一行:
a[index] = box
我知道数组的内存是使用malloc在C中分配的。我试图在将C Box传递给C函数之前将其添加到数组中。解决这个问题的方法是让我用C编写一个函数,它可以接收数组和创建结构所需的项,而我在C中做那部分?我试图尽量减少对C的调用次数,所以如果我可以从Go创建数组,那就太好了。真的很难知道如何安全地将数据数组传递到C中的函数。
慕哥9229398
慕盖茨4494581
相关分类