示例
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