在编写 Erlang C NIF 时,如何将在 C 中创建的指针(比如说数组)返回给 Erlang,以供同一个 Erlang 进程在另一个 NIF 调用中使用?
#define LENGTH = 50;
int *a, array[LENGTH];
a = enif_alloc(LENGTH * sizeof(int));
它应该是一个可以返回甚至存储的指针,这样当我从同一个 Erlang 进程中返回到 NIF 时,我可以访问指针和它引用的内存。
在编写 Erlang C NIF 时,如何将在 C 中创建的指针(比如说数组)返回给 Erlang,以供同一个 Erlang 进程在另一个 NIF 调用中使用?
#define LENGTH = 50;
int *a, array[LENGTH];
a = enif_alloc(LENGTH * sizeof(int));
它应该是一个可以返回甚至存储的指针,这样当我从同一个 Erlang 进程中返回到 NIF 时,我可以访问指针和它引用的内存。
在这种特殊情况下,我会使用enif_alloc_resource
. 创建一个结构来包含您的指针并将其建立为资源对象。
您也可以将其编码为二进制文件,但我建议不要这样做,因为它允许 erlang 函数在将内容传递回之前修改内容。资源类型从 erlang 端是不透明的,无法修改。
要从 Nif 返回二进制文件,我使用 enif_alloc_binary 和 enif_make_binary。然后在将访问指针的 Nif 中传递二进制文件并在参数上使用 enif_inspect_binary 来获取包含指向数据的指针的 ErlNifBinary。