更新:2007 年 11 月
stackalloc 关键字用于不安全的代码上下文中,以便在堆栈上分配内存块。
复制代码 | |
---|---|
int* fib = stackalloc int[100]; |
备注
下面的示例输出斐波那契数列的 100 个数字,其中每个数字都是前两个数字之和。在代码中,大小足够容纳 100 个 int 类型元素的内存块是在堆栈上分配的,而不是在堆上分配的。该块的地址存储在 fib 指针中。此内存不受垃圾回收的制约,因此不必将其钉住(通过使用
stackalloc 仅在局部变量的初始值设定项中有效。
由于涉及指针类型,因此 stackalloc 要求
stackalloc 类似于 C 运行时中的
安全性
不安全代码的安全性低于安全替代代码。但是,通过使用 stackalloc 可以自动启用公共语言运行时 (CLR) 中的缓冲区溢出检测功能。如果检测到缓冲区溢出,进程将尽快终止,以最大限度地减小执行恶意代码的机会。
示例
C# | 复制代码 |
---|---|
class Test { static unsafe void Main() { const int arraySize = 20; int* fib = stackalloc int[arraySize]; int* p = fib; *p++ = 1; for (int i = 2; i < arraySize; ++i, ++p) { // Sum the previous two numbers. *p = p[-1] + p[-2]; } for (int i = 0; i < arraySize - 1; ++i) { Console.WriteLine(fib[i]); } // Keep the console window open in debug mode. System.Console.WriteLine("Press any key to exit."); System.Console.ReadKey(); } } /* Output 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 */ |
C# 语言规范
有关更多信息,请参见 C# 语言规范中的以下各章节:
18.8 堆栈分配