Go - cgo访问C数组 & 内存
发布日期:2021-05-14 03:41:59 浏览次数:20 分类:精选文章

本文共 1696 字,大约阅读时间需要 5 分钟。

示例

package main/*#include 
#include
struct Dog { char name[32]; int id;};#define MAX_DOG 16struct Dog dogs[MAX_DOG];*/import "C"import "fmt"import "unsafe"func main () { var dog C.struct_Dog fmt.Println("C Array >>>>>>>>>>>>>>>>>>>") // C 定义数组可直接通过 range 访问 for k, v := range C.dogs { //fmt.Println("k=", k) dog = v dog.id = C.int(k) fmt.Println("Id", int(dog.id)) } fmt.Println("C Malloc >>>>>>>>>>>>>>>>>>>") ptr := C.malloc(C.sizeof_struct_Dog * C.size_t(10)) var e *C.struct_Dog var Ptr uintptr fmt.Println("malloc", ptr) e = (*C.struct_Dog)(ptr) for i := 0; i < 10; i++ { e.id = C.int(i) // 通过unsafe.Pointer 访问内存地址 Ptr = (uintptr)(unsafe.Pointer(ptr)) + (uintptr)(C.sizeof_struct_Dog * C.int(i)) e = (*C.struct_Dog)(unsafe.Pointer(Ptr)) } Ptr = uintptr(unsafe.Pointer(ptr)) for i := 1; i < 10; i++ { e = (*C.struct_Dog)(unsafe.Pointer(Ptr)) fmt.Println("ptr", unsafe.Pointer(Ptr)) fmt.Println("id", int(e.id)) Ptr = (uintptr)(unsafe.Pointer(ptr)) + (uintptr)(C.sizeof_struct_Dog * C.int(i)) } defer C.free(ptr)}

输出:

# go build c_struct_array.goC Arrary >>>>>>>>>>>>>>>>>>>>Id 0Id 1Id 2Id 3Id 4Id 5Id 6Id 7Id 8Id 9Id 10Id 11Id 12Id 13Id 14Id 15C Malloc >>>>>>>>>>>>>>>>>>>>malloc 0x196b7e0ptr 0x196b7e0id 1ptr 0x196b804id 2ptr 0x196b828id 3ptr 0x196b84cptr 0x196b870id 5ptr 0x196b894id 6ptr 0x196b8b8id 7ptr 0x196b8dcid 8ptr 0x196b900id 9
上一篇:Rescheduling Interrupts
下一篇:Go黑魔法之cgo & reflect访问list存储C指针

发表评论

最新留言

不错!
[***.144.177.141]2025年04月30日 14时22分02秒