2013-12-21 39 views
1

当我加入Fillchar()后寻找做C'S memset()相当于帕斯卡程序给一个运行时错误216赛格故障/错误216使用Fillchar()

这里是我的代码(如果我删除FillChar(),它工作正常):

function NewFoo(name : string) : ptrfoo; 
var sym : ptrfoo; 
begin 
    new(sym); 
    FillChar(sym, SizeOf(foo), #0); 
    sym^.name := name; 
    NewFoo := sym; 
end; 

foorecordfooptr到它定义为type fooptr = ^foo;一个指针。

我该如何解决这个问题?

回答

4

Fillchar需要无类型参数,而不是指针。因为它是用零覆盖指针本身(以及超出它的内存)。你想取消引用指针与Fillchar使用它:

FillChar(sym^, SizeOf(foo), #0); 

非类型参数的形式为const foovar fooout foo的参数看似无类型重视他们。它们不能直接分配或使用,但可以取消引用它们并获得指向它们的指针。基本上,它们是语法糖,能够将记录和其他变量传递给数据块,而不必从调用端获取C风格的指针(实际上它稍微复杂一点,但那是它的要点)。

+0

非常感谢。我在互联网上搜索了很多如何做动态分配的例子,并用零填充'malloc()/ memset()'C世界,所以与我的代码相比,但我找不到。 –

+2

@ TheMask这是等价的(或多或少)。 Pascal语义与C不一样,如果你来自C背景,这可能是最令人讨厌的区别。它只是需要一些习惯。 – Thomas