Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在delphi中初始化局部变量?_Delphi_Variables_Initialization - Fatal编程技术网

在delphi中初始化局部变量?

在delphi中初始化局部变量?,delphi,variables,initialization,Delphi,Variables,Initialization,在对旧程序代码的检查过程中,出现了以下问题:方法中的所有局部变量都在开始后立即初始化。通常不初始化局部变量。但是我们有一个过程,其中所有变量都初始化为0。有人知道这是怎么发生的吗 例如: type TPrices = array[0..10, 0..5] of Integer; procedure DoSomething(); var mPrices : TPrices; mValue : Integer; begin if (mPrices[0,0] = 0) then

在对旧程序代码的检查过程中,出现了以下问题:方法中的所有局部变量都在开始后立即初始化。通常不初始化局部变量。但是我们有一个过程,其中所有变量都初始化为0。有人知道这是怎么发生的吗

例如:

type
  TPrices = array[0..10, 0..5] of Integer;

procedure DoSomething();
var
  mPrices : TPrices;
  mValue  : Integer; 
begin
  if (mPrices[0,0] = 0) then
    MessageDlg('Zero', mtInformation, [mbOK], 0);
  if (mValue = 0) then
    MessageDlg('Zero Integer', mtInformation, [mbOK], 0);
end;

这完全是偶然的。变量未初始化。变量将驻留在堆栈上,如果最后写入堆栈位置的内容为零,那么该位置的值仍然为零

未初始化非托管类型的局部变量。不要让上述的巧合让你不以为然

考虑一下这个计划:

{$APPTYPE CONSOLE}

type
  TPrices = array[0..10, 0..5] of Integer;

procedure Foo;
var
  mPrices: TPrices;
begin
  Writeln(mPrices[0,0]);
end;

begin
  Foo;
end.
{$APPTYPE CONSOLE}

type
  TPrices = array[0..10, 0..5] of Integer;

procedure Foo;
var
  mPrices: TPrices;
begin
  Writeln(mPrices[0,0]);
  FillChar(mPrices, SizeOf(mPrices), 0);
end;

procedure Bar;
var
  mPrices: TPrices;
begin
  Writeln(mPrices[0,0]);
end;

begin
  Foo;
  Bar;
end.
{$APPTYPE CONSOLE}

type
  TPrices = array[0..10, 0..5] of Integer;

procedure Foo;
var
  mPrices: TPrices;
begin
  Writeln(mPrices[0,0]);
  FillChar(mPrices, SizeOf(mPrices), 0);
  mPrices[0,0] := 666;
end;

procedure Bar;
var
  mPrices: TPrices;
begin
  Writeln(mPrices[0,0]);
  Writeln(mPrices[0,1]);
end;

begin
  Foo;
  Bar;
end.
在我的机器上运行时,输出为:

1638012 1638012 0 1638012 666 0 这一次的输出是:

1638012 1638012 0 1638012 666 0 现在输出为:

1638012 1638012 0 1638012 666 0 1638012 666 0
正如您所想象的,许多不同的事情可能会导致堆栈空间的内容发生变化。所以相信你所知道的。非托管类型的局部变量没有初始化。

这真的是Q@TLama的翻版吗?@David,答案就在这里。但是,嗯,例如,它更好。将会有更多的人。。。[我将重新打开这一个]@TLama“这一个”问题与方法/过程中的局部变量无关,而是关于全局变量。我很喜欢复制品中的那个。@Lasse,是的,但是如果我们学究气十足,我们可以沿着标题一直到复制品的问题链接,说“这个问题已经有答案了”。这两个问题都有答案。我个人会将“非托管类型的局部变量如何初始化?”的问题与“一般情况下变量如何初始化?”的问题联系起来。@DavidHeffernan:虽然我同意将所有内容都放在一个自上而下的回答中是很好的,但也有一些简短的、切中要害的回答。随着所有字符串的变化,我在谷歌上仔细检查了10.2的状态,因为我正在从D2006(使用TMS unicode hell)移植一个遗留项目。我点击了8次才找到答案861045,然后是这个。我只能想象一个完全的新手会有怎样的体验。也许允许传递一些直接的答案,然后在对主要回复的引用中进行注释?我也尝试获得不同的初始化值,但当我添加一个真正大的数组(2000x100)时,数组的所有值也初始化为零。对于未初始化的变量来说非常不现实。另外,我在调用上述方法之前直接添加了一个方法,在该方法中,我用$FF初始化了一个数组(大小为100x100)。再说一次:上面方法中的所有内容都是0。我不知道该如何看待这个评论。好像你不相信我似的。@elite什么是不现实的?当你的机器关闭时,内存中没有电流,这真的很不公平吗。所以当你打开它的时候,你的大部分内存恰好处于默认的全零状态?在程序开始运行之前,清除调用堆栈当前分配的内存块是不现实的吗?(操作系统可能会在启动你的应用程序之前初始化调用堆栈。但这只会发生一次,这就是为什么你不能依赖它。如果操作系统确实初始化调用堆栈,这可能会改变。)@elite如果你想提供一个简单的示例,演示你在$FF未按预期工作的情况下初始化阵列的测试,我们可以解释你做错了什么。(我猜你可能使用了动态数组。)经过更多的测试,我得出结论,这里的行为似乎是一系列的可能性,在我的例子中,这些可能性总是导致一个带有零的内存。也许这与函数所需的内存量有关,但我不太清楚。谢谢你的耐心。