【发布时间】:2021-05-30 22:42:27
【问题描述】:
为什么const char * 和string 和char * 的结果是对象“字节数组”?
一个简单的例子:
$ffi = FFI::cdef(
"const char *strerror(int errnum);",
"libc.so.6"
);
var_dump($ffi->strerror(1));
返回
string(23) "Operation not permitted"
从定义中删除 const 返回:
object(FFI\CData:char*)#1074 (1) {
[0]=>
string(1) "O"
}
背景
动态链接的外部 C 库的函数返回包含 NULL 字节的二进制数据。当 const 在头文件的定义中时,结果字符串不完整 = 缩短为第一个 NULL 字节 = 损坏的文件。
我的解决方法
从定义中删除const 并
$array = $ffi->strerror(1);
$string = FFI::string($array);
返回正确的完整字符串。
(在现实生活场景中,FFI::string($array, $size) 的 $size 是已知的,并从 C 库的不同函数返回。)
【问题讨论】:
标签: php c char constants php-ffi