用 new T[] 分配的陣列可以透露它們的大小嗎?
與它的對應的delete[] 不同,它本質上知道T[] 的大小分配的數組,C 缺乏一種機制來以編程方式確定使用new T[] 創建的數組的大小。
深入研究差異
這種差異的關鍵在於在delete[]的本質中。在編譯期間,數組的大小由運行時或作業系統的記憶體管理器精心保存。但是,編譯器仍然無法存取此資訊。相反,sizeof() 作為編譯器的操作數而不是真正的函數,無法確定動態分配數組的大小,因為它們的範圍在編譯時不確定。
說明性範例
考慮以下程式碼範例:
int *arr = new int[256]; int *p = &arr[100]; printf("Size: %d\n", sizeof(p));
在這裡,編譯器面臨著一個令人困惑的困境:如何確定p 的大小。數組的指標缺乏所分配記憶體區塊的開始或結束的固有知識。它們可能指示區塊的開始、其中的特定元素,甚至任意位置。
固有限制
C 和 C 數組,與一流不同對象,退化為指針。編譯器和程式都不知道指標是否標識了新區塊的開始、單一物件或中間位址。
這種設計選擇源自於 C 和 C 中記憶體管理的委託性質,從而使它給程式設計師和作業系統。新建和刪除的實作在不同平台和場景之間差異很大,排除了 C 標準內的標準化。
以上是你能確定 C 中用「new T[]」分配的陣列的大小嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!