TheDeveloperBlog.com


C# Stackalloc Operator

Stackalloc allocates memory in an unsafe context. This C# operator is similar to the alloca function from the C language. It implements a form of malloc that frees the memory when the calling function returns.

Tip: Stackalloc creates buffers for usage with external code or string constructors.


Example. This program uses an unsafe method context. This means that to compile it you must enable unsafe code to be used. It shows the stackalloc operator for allocating memory on the stack. It is not a useful method for real-world programs.

Stackalloc is similar to the alloca function in C, which is a form of malloc that frees its memory automatically. The program here allocates a character buffer on the stack and writes values to it.

Then: It returns a string type that was created through the constructor. The string will reside on the managed heap.

C# program that uses stackalloc operator

using System;

class Program
{
    unsafe static string GetStringStackalloc()
    {
	// Allocate a character buffer with the stackalloc operator.
	// ... Assign the memory to specific letters.
	// ... Add the terminal character.
	char* buffer = stackalloc char[50 + 1];
	for (int i = 0; i < 10; i++)
	{
	    buffer[i] = 'a';
	}
	for (int i = 10; i < 50; i++)
	{
	    buffer[i] = 'z';
	}
	buffer[50] = '\0';
	return new string(buffer);
    }

    static void Main()
    {
	// Call the stackalloc method to get the result string.
	// ... Also demonstrate its correctness by using the string constructor.
	Console.WriteLine(GetStringStackalloc());
	Console.WriteLine(new string('a', 10) + new string('z', 40));
    }
}

Output

aaaaaaaaaazzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
aaaaaaaaaazzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

This program introduces two methods. The GetStringStackalloc method internally uses the stackalloc operator and is in an unsafe context. And in the Main entry point, control flow begins.

The stackalloc operator is used in the first method to allocate a buffer of 51 characters (102 bytes) on the stack. The memory is initialized to the values 'a' and 'z'. The fifty-first character is set to the null character literal.

Char

Note: This signals that the string is only 50 characters long and that no uninitialized memory following this should be stored.

Review: You can initialize a character buffer with stackalloc and use that to construct a new string type.

String Constructor

Also: The stackalloc operator can be used for other primitive data type buffers—not just chars.

ValueType

Discussion. When is memory freed? The C# specification describes the purpose of the stackalloc operator as a way to circumvent the standard garbage collection mechanism. Stackalloc is a version of the alloca function in many C implementations.

So: The memory allocated by the function is freed upon return from the function, when the activation record is popped from the stack.


Summary. We used the stackalloc operator in an unsafe context. This operator is used as a way of manually allocated memory buffers that can be used without type safety checks. Stackalloc can be used for external DLL code written in other languages.