CGO数组处理

大佬们求助!
问题一:数组取值不全,只能取得第一条;
问题二:users.name转换成string。

package main

/*
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

typedef struct User{
   char name[64];
   int uid;
}User;

static struct User *
getUsers(){
   static struct User users[3] = {{"admin",1},{"kaha",2},{"dddd",3}};
   return users;
}
*/
import "C"
import (
    "fmt"
    "reflect"
)

func main() {
    users := C.getUsers()
    fmt.Println(reflect.TypeOf(users.name))

    fmt.Println(users.name)
}
阅读 2.3k
2 个回答
package main

/*
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

typedef struct User{
   char *name;
   int     uid;
}User;

typedef struct Users{
    struct User items[3];
}Users;

static struct Users *
getUsers(){
        //static static User user1,user2,user3
           static struct Users *p;
           static struct Users users;
        users.items[0].name = "admin1";
        users.items[0].uid = 1;
        users.items[1].name = "admin2";
        users.items[1].uid = 2;
        users.items[2].name = "admin3";
        users.items[2].uid = 3;
        p = &users;

           return(p);
}
*/
import "C"
import (
    "fmt"
)

func main() {
    ptr := C.getUsers()
    for k, v := range ptr.items {
        fmt.Println(k, C.GoString((*C.char)((C.User)(v).name)))
    }
}

内存是相同的,强制转换内存就行,但是不够工程化

func main() {
    users := C.getUsers()
    fmt.Println(reflect.TypeOf(users.name))

    fmt.Println(users.name)

    // 转换成string,直接使用内存强制转换
    type Item struct {
        Name [64]byte
        Uid  int32
    }
    type Items [3]Item
    m := (*Items)(unsafe.Pointer(users))
    fmt.Println(m)

    for _, v := range m {
        fmt.Println(string(v.Name[:]), v.Uid)
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题