gforth调用带字符串的C函数printf
我用一个gforth调用带字符串的C函数printf,c,gforth,C,Gforth,我用一个S“…”字符串调用C函数printf,我遇到了一个无效的内存地址。将指向在第四方创建的以null结尾的字符串的指针传递给C的正确方法是什么 下面是gforth中hello world的两个版本,一个使用专用语法写出文字字符串,另一个使用type并将字符串存储为值(尽管很简单) 下面是helloworld.fs #! /usr/bin/env gforth .( Hello, world!) CR bye #! /usr/bin/env gforth S" Hello, world!"
S“…”
字符串调用C函数printf
,我遇到了一个无效的内存地址。将指向在第四方创建的以null结尾的字符串的指针传递给C的正确方法是什么
下面是gforth
中hello world的两个版本,一个使用专用语法写出文字字符串,另一个使用type
并将字符串存储为值(尽管很简单)
下面是helloworld.fs
#! /usr/bin/env gforth
.( Hello, world!)
CR
bye
#! /usr/bin/env gforth
S" Hello, world!" type
CR
bye
#! /usr/bin/env gforth
\c #include <stdio.h>
c-function printf- printf a -- n
S" hello" printf-
CR
bye
和helloworld2.fs
#! /usr/bin/env gforth
.( Hello, world!)
CR
bye
#! /usr/bin/env gforth
S" Hello, world!" type
CR
bye
#! /usr/bin/env gforth
\c #include <stdio.h>
c-function printf- printf a -- n
S" hello" printf-
CR
bye
据我所知,语法S“Hello,world”
在Forth运行时的某个全局区域中创建一个新字符串,并将指向它的指针推送到堆栈上。它也可能是一个更丰富的对象,我不知道Forth是否使用以null结尾的字符串
在任何情况下,gforth
在hello\u world\u C.fs
#! /usr/bin/env gforth
.( Hello, world!)
CR
bye
#! /usr/bin/env gforth
S" Hello, world!" type
CR
bye
#! /usr/bin/env gforth
\c #include <stdio.h>
c-function printf- printf a -- n
S" hello" printf-
CR
bye
我猜这里的问题来自这样一个事实:S“hello”
实际上不是指针,而是其他东西。有没有办法将其转换为指针,以便调用printf
将指向正确的对象?因为S“
不会创建以null结尾的字符串,也不会专门将地址推送到堆栈上
S“
创建一个临时位置(至少在下一次调用S”
之前,该位置似乎一直存在),并将长度和地址推送到堆栈上
调用S“
后,长度位于堆栈顶部,此顺序很重要
下面是一个示例交互式会话,其中包含gforth
,为清晰起见,插入了注释和提示(
)
$ gforth
> S" a" ( define a new string, push length and addr )
> .s ( display size of stack and contents of stack )
<2> 22565888 1
> . ( print and drop top item of stack )
1
> .s ( display size and contents of stack again )
<1> 22565888
bye
它打印出hello world,然后正常退出。查看ANS Forth spec(),它不应该是
\z
而不是\0
?