C 程式設計/MS Windows 參考/alloc.h
外觀
< C 程式設計 | MS Windows 參考
"alloc.h" 是一個非標準的標頭檔案。它不是 ANSI 標準的一部分,因此不是 ANSI C 標頭檔案,但存在於許多 C 語言方言中。它可用於 Borland Turbo C 和 TIGCC。此標頭檔案提供了關於動態記憶體分配的操作。此標頭檔案包含 "記憶體管理" 函式。
要使用 alloc.h 中的函式,我們必須在使用它們之前包含 alloc.h 。
#include <stdio.h>
#include <alloc.h>
int main()
{
int *ptr;
ptr = (int *) alloca (sizeof(int));
scanf("%d", ptr);
printf("%d is stored dynamically.\n", *ptr);
return 0;
}
| 函式宣告 | 函式目的 |
|---|---|
void *alloca (unsigned long Size); |
在堆疊記憶體上分配儲存空間。 |
void *calloc (unsigned short NoOfItems, unsigned short SizeOfItems); |
從記憶體堆中為給定數量的元素分配記憶體儲存空間。為變數設定的空間的值將自動初始化為零。 |
void *calloc_throw (unsigned short NoOfItems, unsigned short SizeOfItems); |
呼叫 calloc 並如果記憶體不可用則丟擲錯誤。否則返回 calloc 返回的地址。 |
void *malloc (unsigned long Size); |
它在記憶體堆中分配 "Size" 位元組記憶體。它在失敗時返回 NULL。此記憶體塊可以透過 free 函式釋放。 |
void *malloc_throw (unsigned long Size); |
呼叫 malloc 並如果記憶體不可用則丟擲錯誤。否則返回 malloc 返回的地址。 |
void *realloc (void *Ptr, unsigned long NewSize); |
重新分配以前由 *Ptr 分配的記憶體塊。它返回重新分配的記憶體塊的地址,該地址可能與 Ptr 不同。它在失敗時返回 NULL。 |
void *realloc_throw (void *Ptr, unsigned long NewSize); |
呼叫 realloc 並如果記憶體不可用則丟擲錯誤。否則返回 realloc 返回的地址。 |
void free (void *Ptr); |
直接到控制檯釋放由 malloc 或 calloc 分配的記憶體。 |
| 函式宣告 | 函式目的 |
|---|---|
HANDLE HeapAlloc (unsigned long Size); |
它分配 Size 位元組的記憶體堆並返回控制代碼。Size 被視為偶數。奇數大小向上取整。分配的記憶體儲存在單鏈表結構中。最大大小為 65520 位元組,最小大小為 6 位元組。它在失敗時返回 H_NULL。 |
HANDLE HeapAllocThrow (unsigned long Size); |
它呼叫 HeapAlloc 函式並返回相應的控制代碼。它在失敗時丟擲錯誤。 |
HANDLE HeapAllocESTACK (unsigned long Size); |
如果 "Size" 位元組記憶體不可用,則它會截斷表示式堆疊。即使在減少堆疊記憶體後仍然不可用,它也會返回 H_NULL。 |
HANDLE HeapAllocHigh (unsigned long Size); |
它在記憶體堆的高階分配記憶體並返回控制代碼。它將所有已用記憶體塊向下移動到堆中。如果記憶體不可用,它將返回 H_NULL。 |
HANDLE HeapAllocHighThrow (unsigned long Size); |
它呼叫 HeapAllocHigh 函式並返回控制代碼。在失敗時,它會丟擲記憶體錯誤。 |
void *HeapDeref (HANDLE Handle); |
它對控制代碼進行反引用並返回記憶體地址。要使用由控制代碼保留的記憶體,必須對控制代碼進行反引用。 |
void HeapFree (HANDLE Handle); |
它釋放由控制代碼分配的記憶體。 |
void HeapFreeIndir (HANDLE *HandlePtr); |
它釋放與傳遞的控制代碼關聯的記憶體塊並將控制代碼設定為 NULL。 |
void *HeapAllocPtr (unsigned long Size); |
它非常類似於 HeapAllocHigh。它做同樣的事情。但它不是返回控制代碼,而是返回指向分配塊的指標。它在失敗時返回 NULL。 |
void *HeapAllocPtrThrow (unsigned long Size); |
它呼叫 HeapAllocPtr 並返回相應的指標。它在失敗時丟擲錯誤。 |
void HeapFreePtr (void *Ptr); |
它釋放由 HeapAllocPtr 分配的記憶體塊。 |
| 函式宣告 | 函式目的 |
|---|---|
unsigned long HeapAvail (void); |
它返回記憶體堆中可用的總位元組數。 |
void HeapCompress (void); |
它壓縮所有分配的堆記憶體塊。如果可能,它會刪除空閒記憶體塊。此函式通常在必要時在內部呼叫。 |
void *HeapEnd (void); |
它返回指向記憶體堆末端的指標。 |
HANDLE HeapLock (HANDLE Handle); |
它鎖定由控制代碼分配的記憶體塊。它在成功時返回相同的控制代碼,否則返回 H_NULL。鎖定確保在記憶體堆重新排列期間不會移動或刪除記憶體塊。 |
short HeapGetLock (HANDLE Handle); |
它確定傳遞的控制代碼是否已鎖定。如果塊未鎖定,則返回 0。 |
void *HLock (HANDLE Handle); |
它鎖定並反引用由控制代碼保留的記憶體塊。 |
unsigned long HeapMax (void); |
它返回可以保留的記憶體塊的最大大小。 |
| 成員常量 | 描述 |
|---|---|
H_NULL |
它被稱為空控制代碼。它定義為零值。 |
NULL |
它是一個空指標。它指向地址 0。 |
- Bool
enum Bool {FALSE, TRUE};
它是一個列舉。它定義了兩個二進位制值 false 和 true。常量 FALSE 代表邏輯 0,而常量 TRUE 代表邏輯 1。
- HANDLE
typedef unsigned short HANDLE;
控制代碼代表一個已分配的對齊的記憶體塊。它的地址可以透過 alloc.h 中的 HeapDeref 函式檢索。HANDLE 用於管理由 alloc.h 函式分配的記憶體。其他標頭檔案中的某些函式使用 HANDLE 作為引數。

- alloca 函式與標準
malloc函式不同,malloc 在記憶體堆中分配記憶體,而alloca在堆疊記憶體中分配記憶體。因此,此儲存是本地的。在函式中,如果使用alloca分配記憶體,則它會在函式結束時自動釋放。alloca更適合需要本地動態記憶體分配的應用程式。
malloc以線性順序分配給定的位元組塊。它需要連續的記憶體塊。HeapAlloc分配儲存在連結串列結構中的記憶體。它是有利的。
- 許多時候,記憶體塊是保留的。長時間鎖定的記憶體塊應該移動到堆中較高的位置。這減少了這些塊與系統其餘部分的干擾。這可以透過使用
HeapAllocHigh函式來實現。這會在請求記憶體分配之前重新排列堆。
- 當我們呼叫
malloc時,記憶體管理器會為分配的塊分配一個稱為控制代碼的指標。為每個塊分配控制代碼。因此,當我們要使用大量小尺寸的記憶體塊時,malloc效率不高。由於大量控制代碼,處理變得很困難。因此,alloca是這種情況下的更好選擇。
- "alloc.h" 中的
HeapRealloc函式與 realloc 類似。在HeapRealloc的情況下,如果重新分配失敗,它會釋放先前分配的記憶體。通常,realloc 會保持先前分配的記憶體塊完好無損。