C# 语言规范   A.7 堆栈分配在不安全上下文中,局部变量声明(第 8.5.1 节)可以包含一个从调用堆栈中分配内存的堆栈分配初始值设定项。 变量初始值设定项: 
表达式
数组初始值设定项
stackalloc 初始值设定项 
stackalloc 初始值设定项: 
stackalloc 非托管类型 [ 表达式 ] 
非托管类型指示将在新分配的位置中存储的项的类型,而表达式则指示这些项的数目。合在一起,它们指定所需的分配大小。由于堆栈分配的大小不能为负值,因此将项的数目指定为计算为负值的常数表达式属于编译时错误。stackalloc T[E] 形式的堆栈分配初始值设定项要求 T 为非托管类型(第 A.2 节),而要求 E 为 int 类型的表达式。该构造从调用堆栈中分配 E * sizeof(T) 个字节,并返回一个指向新分配的块的、类型 T* 的指针。如果 E 为负值,则该行为是未定义的。如果 E 为零,则不进行任何分配,并且返回的指针是由实现定义的。如果没有足够的内存以分配给定大小的块,则引发 System.StackOverflowException。 新分配的内存的内容是未定义的。无法显式释放使用 stackalloc 分配的内存。相反,在函数成员的执行期间创建的所有堆栈分配内存块都将在函数成员返回时自动丢弃。这对应于通常存在于 C 和 C++ 实现中的 alloca 函数扩展。在 catch 或 finally 块(第 8.10 节)中不允许使用堆栈分配初始值设定项。在下面的示例中class Test
{
   unsafe static string IntToString(int value) {
      char* buffer = stackalloc char[16];
      char* p = buffer + 16;
      int n = value >= 0? value: -value;
      do {
         *--p = (char)(n % 10 + '0');
         n /= 10;
      } while (n != 0);
      if (value < 0) *--p = '-';
      return new string(p, 0, (int)(buffer + 16 - p));
   }
   static void Main() {
      Console.WriteLine(IntToString(12345));
      Console.WriteLine(IntToString(-999));
   }
}ms-help://MS.NETFrameworkSDK.CHS/csspec/html/vclrfcsharpspec_A_7.htm