企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# stackalloc(C# 参考) **stackalloc** 关键字用于不安全的代码上下文中,以便在堆栈上分配内存块。 ``` int* block = stackalloc int[100]; ``` ## 备注 关键字仅在局部变量的初始值中有效。下面的代码导致编译器错误。 ``` int* block; // The following assignment statement causes compiler errors. You // can use stackalloc only when declaring and initializing a local // variable. block = stackalloc int[100]; ``` 由于涉及指针类型,因此 **stackalloc** 要求[不安全](https://msdn.microsoft.com/zh-cn/library/chfa2zb8.aspx)上下文。有关更多信息,请参见 [不安全代码和指针(C# 编程指南)](https://msdn.microsoft.com/zh-cn/library/t2yzs44b.aspx)。 **stackalloc** 类似于 C 运行库中的 [_alloca](https://msdn.microsoft.com/zh-cn/library/wb1s57t5.aspx)。 以下代码示例计算并演示 Fibonacci 序列中的前 20 个数字。每个数字是先前两个数字的和。在代码中,大小足够容纳 20 个 **int** 类型元素的内存块是在堆栈上分配的,而不是在堆上分配的。该块的地址存储在 fib 指针中。此内存不受垃圾回收的制约,因此不必将其钉住(通过使用 [fixed](https://msdn.microsoft.com/zh-cn/library/f58wzh21.aspx))。内存块的生存期受限于定义它的方法的生存期。不能在方法返回之前释放内存。 ``` class Test { static unsafe void Main() { const int arraySize = 20; int* fib = stackalloc int[arraySize]; int* p = fib; // The sequence begins with 1, 1. *p++ = *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; ++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 6765 */ ``` ## 安全性 不安全代码的安全性低于安全替代代码。但是,通过使用 **stackalloc** 可以自动启用公共语言运行时 (CLR) 中的缓冲区溢出检测功能。如果检测到缓冲区溢出,进程将尽快终止,以最大限度地减小执行恶意代码的机会。 ## C# 语言规范 有关详细信息,请参阅 [C# 语言规范](https://msdn.microsoft.com/zh-cn/library/ms228593.aspx)。该语言规范是 C# 语法和用法的权威资料。 ## 请参阅 [C# 参考](https://msdn.microsoft.com/zh-cn/library/618ayhy6.aspx) [C# 编程指南](https://msdn.microsoft.com/zh-cn/library/67ef8sbd.aspx) [C# 关键字](https://msdn.microsoft.com/zh-cn/library/x53a06bb.aspx) [运算符关键字(C# 参考)](https://msdn.microsoft.com/zh-cn/library/bewds7kc.aspx) [不安全代码和指针(C# 编程指南)](https://msdn.microsoft.com/zh-cn/library/t2yzs44b.aspx)