我正在尝试在lua中调用
c
函数,c
函数位于so
文件中,代码如下:
typedef struct attributes_s {
char name[256];
char id[256];
}attributes_t
int get_service_instances(attributes_t **array, size_t *service_nums);
这个函数会给
array
和service_nums
赋值,array
可能有多个attributes_t
实例,现在我只让它返回一个。
lua
代码是这样的
local ffi_Cli = ffi.load("client")
ffi.cdef[[
typedef struct attributes_s {
char name[256];
char id[256];
}attributes_t
int get_service_instances(attributes_t **array, size_t *service_nums);
]]
local get_services_result = ffi.new("attributes_t*[1]")
local res_len = ffi.new("size_t[1]")
if ffi_Cli.get_service_instances(get_services_result, res_len) ~= 0 then
print("get failed")
return
end
print(get_services_result[1].name) -- get cdata<char (&)[256]>
print(ffi.string(get_services_result[1].name, 256)) -- get coredump
如果我使用
ffi.string(get_services_result[1].name, 256)
或将256更改为其他数字,它将coredump,gdb bt
是这样的
#0 0x00007f55a558cff1 in __strlen_sse2_pminub () from /lib64/libc.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.17-222.el7.x86_64 libgcc-4.8.5-28.el7.x86_64 libstdc++-4.8.5-28.el7.x86_64 libuuid-2.23.2-52.el7.x86_64 libyaml-0.1.4-11.el7_0.x86_64 nss-softokn-freebl-3.34.0-2.el7.x86_64 sssd-client-1.16.0-19.el7.x86_64 zlib-1.2.7-17.el7.x86_64
(gdb) bt
#0 0x00007f55a558cff1 in __strlen_sse2_pminub () from /lib64/libc.so.6
#1 0x00007f55a78a64a6 in lj_cf_ffi_string (L=0x7f55a831a380) at lib_ffi.c:691
我不知道如何获得
attributes_t
的值,为什么我不能使用char*
获得
ffi.string()
我像这样将 1 更改为 0
get_services_result[0].name
并且它有效。但lua
中的下标不是从1开始的吗?