【问题标题】:Why do I get an access violation when I call FillChar?为什么我在调用 FillChar 时会遇到访问冲突?
【发布时间】:2010-11-16 09:00:06
【问题描述】:

考虑我的示例代码:

var p512Sector:PByte;
.....
getmem(p512Sector, 262144);
FillChar( p512Sector,262144 ,0);

当我运行程序时,Delphi 给我一个违规访问错误。为什么?

【问题讨论】:

  • 您可以简单地使用 AllocMem (docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/…) 来获得一个零初始化的缓冲区。
  • 一般来说,ZeroMemory(Windows“宏”)可能比FillChar(Delphi RTL)更具可读性。请注意,ZeroMemory do 需要一个指针,而不是取消引用的值。 (比较Move(Delphi RTL)和Windows API“宏”CopyMemory/MoveMemory。前者需要一个变量,后者需要指针。)
  • 为什么不使用动态字节数组?

标签: delphi


【解决方案1】:

使用FillChar(p512Sector^, 262144, 0)(注意取消引用^)。否则,您将覆盖 指针 和内存中的内容,而不是分配的缓冲区。

【讨论】:

    【解决方案2】:

    FillChar 需要一个无类型变量。您应该取消引用指针:

    FillChar(p512Sector^, ...);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多