stackalloc分配的空间会初始化吗?

CsToD 2008-04-13 06:31:59
在书上和网上查到的资料都说不会初始化,但我用了各种方法,打印的结果仍然是初始值
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不进行初始化的任何证据
...全文
128 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
CsToD 2008-04-16
  • 打赏
  • 举报
回复
up
CsToD 2008-04-15
  • 打赏
  • 举报
回复
up
CsToD 2008-04-14
  • 打赏
  • 举报
回复
up
gomoku 2008-04-14
  • 打赏
  • 举报
回复
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
CsToD 2008-04-14
  • 打赏
  • 举报
回复
up

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧