Go - cgo访问C数组 & 内存

示例

package main
/*
#include <stdlib.h>
#include <stdio.h>

struct Dog {
    char name[32];
    int  id;
};

#define MAX_DOG 16

struct Dog dogs[MAX_DOG];
*/
import "C"
import "fmt"
import "unsafe"

func main () {
    var dog  C.struct_Dog
    fmt.Println("C Arrary >>>>>>>>")
    // 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)
        // 通过uintptr & 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.go
# ./c_struct_array
C Arrary >>>>>>>>
Id 0
Id 1
Id 2
Id 3
Id 4
Id 5
Id 6
Id 7
Id 8
Id 9
Id 10
Id 11
Id 12
Id 13
Id 14
Id 15
C Malloc >>>>>>>>
malloc 0x196b7e0
ptr 0x196b7e0
id 1
ptr 0x196b804
id 2
ptr 0x196b828
id 3
ptr 0x196b84c
id 4
ptr 0x196b870
id 5
ptr 0x196b894
id 6
ptr 0x196b8b8
id 7
ptr 0x196b8dc
id 8
ptr 0x196b900
id 9
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值