ECMA-334 C# Language Specification25.7: Stack allocation |
In an unsafe context, a local variable declaration (15.5.1) may include a stack allocation initializer, which allocates memory from the call stack.
expression
array-initializer
stackalloc-initializer
unmanaged-type
[
expression
]
The unmanaged-type
indicates the type of the items that will be stored in the newly allocated location, and the expression indicates the number of these items. Taken together, these specify the required allocation size. Since the size of a stack allocation cannot be negative, it is a compile-time error to specify the number of items as a constant-expression
that evaluates to a negative value.
A stack allocation initializer of the form stackalloc T[E] requires T to be an unmanaged type (25.2) and E to be an expression of type int . The construct allocates E * sizeof(T) bytes from the call stack and returns a pointer, of type T*, to the newly allocated block. If E is a negative value, then the behavior is undefined. If E is zero, then no allocation is made, and the pointer returned is implementation-defined. If there is not enough memory available to allocate a block of the given size, a System.StackOverflowException is thrown.
The content of the newly allocated memory is undefined.
Stack allocation initializers are not permitted in catch or finally blocks (15.10).
a stackalloc initializer is used in the IntToString method to allocate a buffer of 16 characters on the stack. The buffer is automatically discarded when the method returns. end example]
using System;
class Test
{
static string IntToString(int value) {
int n = value >= 0 ? value : -value;
unsafe {
char* buffer = stackalloc char[16];
char* p = buffer + 16;
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));
}
}