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