Ruby Fiddle模块中如何表示char*、int*等指针数据类型?
在Ruby Fiddle中表示特定指针类型(char*、int*等)
在Fiddle里,不管是char*、int*还是unsigned int*这类指向具体类型的指针,本质上都可以用Fiddle::TYPE_VOIDP来表示。原因很简单:在C语言底层,所有指针都是固定大小的内存地址,Fiddle并不区分指针指向的具体数据类型——它只需要知道这是一个内存地址值即可。
实际使用示例
比如调用一个接受char*参数并返回char*的C函数(以strdup为例):
require 'fiddle' require 'fiddle/import' module LibC extend Fiddle::Importer dlload 'libc.so.6' # 不同系统可能需要调整库名,比如macOS用'libc.dylib' # 参数和返回值的char*都用TYPE_VOIDP声明 extern 'char* strdup(char*)', [Fiddle::TYPE_VOIDP], Fiddle::TYPE_VOIDP end duplicated_str = LibC.strdup("test string") # 用Fiddle::Pointer解析指针指向的内容 puts Fiddle::Pointer.new(duplicated_str).to_s
如果需要操作指针指向的具体数据(比如读取或写入int*指向的整数),可以借助Fiddle::Pointer类:
# 假设ptr是一个TYPE_VOIDP类型的指针,指向int # 读取指针指向的int值 int_value = ptr[0, Fiddle::SIZEOF_INT].unpack1('i') # 向指针指向的地址写入int值 ptr[0, Fiddle::SIZEOF_INT] = [123].pack('i')
核心逻辑
Fiddle提供的类型常量(比如TYPE_INT)主要用于告知函数调用时参数/返回值的内存大小和传递规则,而所有指针在同一硬件架构下的内存大小是一致的,因此TYPE_VOIDP可以通用表示任何指针类型。
内容的提问来源于stack exchange,提问作者Brijesh
相关产品推荐
相关产品推荐

