Ruby: 取消引用指针

Ruby: dereferencing pointer

如何取消引用 Ruby 中的指针?

我正在使用 FFI 调用一些 C/C++ DLL 函数。其中一个函数 returns 一个整数数组 (int*)。

extern "C" WIN32PROJECT3_API int* TestData()
{
    int* v;

    v = (int*)malloc(sizeof(int)* 1000);

    v[3] = 123456;

    return v;
}

我在 Ruby 中找到了指针,但是当我尝试这样做时

v = TestModule.TestData();
puts v[3]

我得到的是:

#<FFI::Pointer address=0x700f5e>

这很好,因为这是指针的实际值。我只需要取消引用它就可以获得值“123456”

我自己从未从 Ruby 调用过 C/C++,但根据文档,您似乎必须调用 read_string 然后将其转换为 int:

v[3].read_string.to_i

希望对您有所帮助。

您正在寻找 AbstractMemory#get_array_of_int32 方法。

#get_array_of_int32(offset, length) ⇒ Array < Fixnum >

Get 32-bit ints in memory from offset offset.

v = TestModule.TestData.get_array_of_int32(0, 1000) # first convert your memory pointer to array
puts v[3] #=> 123456 

你也可以使用AbstractMemory#get_int32方法:

size_of_int = 4 # size of int32 in bytes
offset = 0
v = TestModule.TestData
v[3 * size_of_int].get_int32(offset) #=> 123456

使用read_int

示例:

v = TestModule.TestData();
puts v[3].read_int