问题说明:go传递二维数组和一维数组到C中;
先说二维数组:
package main
/*
#include <stdio.h>
#include <string.h>
void fill_array(char *s) {
strcpy(s, "cobbliu");
}
void fill_2d_array(char **arr, int columeSize) {
for(int i = 0; i<4;i++){
strcpy((char*)(arr+i*sizeof(char)*columeSize/sizeof(char*)), "cgo");
}
}
*/
import "C"
import "fmt"
import "unsafe"
func main() {
var dir [10]byte
C.fill_array((*C.char)(unsafe.Pointer(&dir[0])))
fmt.Println(string(dir[:]))
//var dirs [4][16]byte
dirs := make([][]byte, 4)
for i := 0; i < 4; i++ {
dirs[i] = make([]byte, 16)
}
C.fill_2d_array((**C.char)(unsafe.Pointer(&dirs[0][0])), C.int(16))
fmt.Println(dirs)
}
尝试上述代码,对于数据量小的却是没问题,但是当数据规模十分大的时候就不一样了,比如当二维数组的个数增加到502个,注意看最后几位,是空的:
....[99 103 111 0 0 0 0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
找了一些说明,是内存问题;我尝试很多方法,但始终误解,最后选择笨重的方案,使用一维数传递数据,再转二维数组:
package main
/*
#include <stdio.h>
#include <string.h>
void fill_array(char *s) {
strcpy(s, "cobbliu");
}
void fill_2d_array(char *arr, int columeSize) {
for(int i = 0; i<502;i++){
strncpy(arr+i*16, "cgo", 16);
}
}
*/
import "C"
import "fmt"
import "unsafe"
func main() {
var dir [10]byte
C.fill_array((*C.char)(unsafe.Pointer(&dir[0])))
fmt.Println(string(dir[:]))
//var dirs [4][16]byte
dirs := make([]byte, 502*16)
C.fill_2d_array((*C.char)(unsafe.Pointer(&dirs[0])), C.int(16))
dirss := make([][]byte, 502)
for i := 0; i < 502; i++ {
dirss[i] = dirs[i*16:i*16+16]
}
fmt.Println(dirss)
}