共用方式為


stackalloc (C# 參考)

stackalloc 關鍵字會在 Unsafe 程式碼內容中用來配置堆疊上的記憶體區塊。

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];

因為牽涉到指標型別 (Pointer Type),stackalloc 需要 unsafe 內容。 如需詳細資訊,請參閱Unsafe 程式碼和指標 (C# 程式設計手冊)

stackalloc 的功用與 C 執行階段程式庫中的 _alloca 相似。

下列範例會計算並顯示 Fibonacci 序列中的前 20 個數字。 每個數字都是前兩個數字的總和。 在程式碼中,足以容納 20 個 int 型別之項目的記憶體區塊會配置在堆疊上,而不是堆積中。 該區塊的位址會儲存於指標 fib 中。 這個記憶體不會進行記憶體回收,因此不須使用 fixed 將記憶體固定住。 記憶體區塊的存留期 (Lifetime) 受限於定義該區塊之方法的存留期。 方法傳回之前,您無法釋放記憶體。

範例

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
*/

安全性

Unsafe 程式碼的安全性不如 Safe 程式碼。 然而,使用 stackalloc 會自動啟用 Common Language Runtime (CLR) 的緩衝區滿溢偵測功能。 如果偵測到緩衝區滿溢,就會儘速中斷處理序,將執行惡意程式碼的機會降到最低。

C# 語言規格

如需詳細資訊,請參閱 C# 語言規格。 語言規格是 C# 語法和用法的決定性來源。

請參閱

參考

C# 關鍵字

運算子關鍵字 (C# 參考)

Unsafe 程式碼和指標 (C# 程式設計手冊)

概念

C# 程式設計手冊

其他資源

C# 參考