C#不安全代码和stackalloc
2015-10-17 22:56
381 查看
stackalloc 关键字用于不安全的代码上下文中,以便在堆栈上分配内存块。如下:
注意:关键字仅在局部变量的初始值中有效。 下面的代码导致编译器错误。
由于涉及指针类型,因此 stackalloc 要求不安全上下文。 有关更多信息,请参见 不安全代码和指针(C# 编程指南)。
stackalloc 类似于 C 运行库中的 _alloca。
以下代码示例计算并演示 Fibonacci 序列中的前 20 个数字。 每个数字是先前两个数字的和。 在代码中,大小足够容纳 20 个 int 类型元素的内存块是在堆栈上分配的,而不是在堆上分配的。
该块的地址存储在 fib 指针中。 此内存不受垃圾回收的制约,因此不必将其钉住(通过使用 fixed)。 内存块的生存期受限于定义它的方法的生存期。 不能在方法返回之前释放内存。
不安全代码的安全性低于安全替代代码。 但是,通过使用 stackalloc 可以自动启用公共语言运行时 (CLR) 中的缓冲区溢出检测功能。 如果检测到缓冲区溢出,进程将尽快终止,以最大限度地减小执行恶意代码的机会。
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 要求不安全上下文。 有关更多信息,请参见 不安全代码和指针(C# 编程指南)。
stackalloc 类似于 C 运行库中的 _alloca。
以下代码示例计算并演示 Fibonacci 序列中的前 20 个数字。 每个数字是先前两个数字的和。 在代码中,大小足够容纳 20 个 int 类型元素的内存块是在堆栈上分配的,而不是在堆上分配的。
该块的地址存储在 fib 指针中。 此内存不受垃圾回收的制约,因此不必将其钉住(通过使用 fixed)。 内存块的生存期受限于定义它的方法的生存期。 不能在方法返回之前释放内存。
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#不安全代码和Fixed
- C#绘制验证码噪声点
- C#操作指针
- C#使用指针表达式
- C#识别身份证号码(经典版)
- (原创)c#学习笔记03--变量和表达式03--变量04--变量的声明和赋值
- C#启动进程之Process
- C# Enum,Int,String的互相转换 枚举转换
- C#指针转换
- C#基础指针类型
- C#不安全代码和指针
- [C#]LINQ小例子
- C#中字符串转换成二进制流
- (原创)c#学习笔记03--变量和表达式03--变量03--字面值
- (原创)c#学习笔记03--变量和表达式03--变量02--变量的命名
- C#中的 int? int??是什么意思
- c# 复制粘贴窗体
- (原创)c#学习笔记03--变量和表达式03--变量01--简单类型
- C#实现无边框窗体拖动
- (原创)c#学习笔记03--变量和表达式02--C#控制台应用程序的基本结构