在书上和网上查到的资料都说不会初始化,但我用了各种方法,打印的结果仍然是初始值
int size=100000;(在不导致溢出时的前提下,size的值足够大)
foo(size);
foo(size);
foo(size);void foo(int size)
{
int*ds=stackalloc int[size];
for(int i=0;i<size;i++)
   if(ds[i]!=0)
       Console.WriteLine(ds[i])//由于所有值都是默认值0,所以不会有任何显示
    else
       ds[i]=1; //更改值为1
}
此方法返回时,ds的生命期结束,但只是栈指针回退size*4,所以其内存中的值会保留之前写入的值(ds[i]=1)由于size的值足够大,当我多次调用foo时,肯定会分配调用foo所分配的空间,那么既然stackalloc不会初始化,就应该有部分内容是之前写入的1但是结果却全都是0谁能解释一下?我实在找不到stackalloc不进行初始化的任何证据

解决方案 »

  1.   

    ECMA-334 C#语言规范 27.7 Stack allocation
    是这么说的:
    The content of the newly allocated memory is undefined微软的C#规范也没有提到stackallc初始化的问题。这就允许不同的CLR执行不同的选项。微软的C#可能费神作了初始化,可能Mono就没有做初始化。他们都不会违反规定。从我们的角度,我们不能寄希望于stack的值被完全保留,也不能寄希望stack的值已经被初始化。因为该行为没有被定义。
    参考:
    http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf
    http://msdn2.microsoft.com/en-nz/vcsharp/aa336809(en-us).aspx