gpt4 book ai didi

pointers - 如何创建一个红色/系统绑定(bind)到一个函数,该函数需要一个指向指针的指针?

转载 作者:行者123 更新时间:2023-12-03 22:16:12 28 4
gpt4 key购买 nike

我正在研究 Red/System 如何使用 #import 语法与来自 Windows DLL、Linux/Android .so 共享库和 OS/X .dylib 的 C 库函数 Hook :

#import [
"libc.so.6" cdecl [

allocate: "malloc" [
size [integer!]
return: [byte-ptr!]
]

free: "free" [
block [byte-ptr!]
]

/* ... */
]

适用于所有基本类型,但是当函数需要指向指针的指针时该怎么办?例如,如果你试图绑定(bind)到类似 getline() 的东西,它有原型(prototype):

ssize_t getline(char **lineptr, size_t *n, FILE *stream);

调用它的一种方式(我想调用它的方式......)是传入的 lineptr 不是预分配的缓冲区,而是 null。在这种情况下,getline 会为您分配缓冲区并修改 char*,使其不再为 null。

作为第一次尝试,我做到了:

getline: "getline" [
lineptr [byte-ptr!] ;-- char **
n [pointer! [integer!]] ;-- size_t *
stream [byte-ptr!] ;-- FILE *
return: [integer!] ;-- ssize_t
]

但是因为没有指针这样的东西! [c-string!] 或类似的,我不知道如何调用它。我可以获取 c-string! 局部变量的地址并将其作为 byte-ptr! 以某种方式传递吗?

最佳答案

Red/System [
Title: "derp"
]

#import [
LIBC-file cdecl [
_fdopen: "fdopen" [
fd [integer!]
type [c-string!]

return: [pointer! [byte!]]
]

_getline: "getline" [
line [pointer! [integer!]]
n [pointer! [integer!]]
stream [pointer! [byte!]]

return: [integer!]
]
]
]

getline: func [
stream [pointer! [byte!]]
return: [c-string!]

/local
line [integer!]
n [integer!]
] [
line: 0
n: 0

_getline :line :n stream
as c-string! line
]

stream: _fdopen 0 "r"
line: getline stream

print line

这行得通。

关于pointers - 如何创建一个红色/系统绑定(bind)到一个函数,该函数需要一个指向指针的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20595992/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com