stackalloc (C# 參考)

更新:2007 年 11 月

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

int* fib = stackalloc int[100];

備註

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

stackalloc 只有在區域變數初始設定式裡有效。

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

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

安全性

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

範例

class Test
{
    static unsafe void Main()
    {
        const int arraySize = 20;
        int* fib = stackalloc int[arraySize];
        int* p = fib;
        *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 - 1; ++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
*/

C# 語言規格

如需詳細資訊,請參閱 C# 語言規格中的下列章節:

  • 18.8 堆疊配置

請參閱

概念

C# 程式設計手冊

參考

C# 關鍵字

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

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

其他資源

C# 參考