當前位置:首頁 » 編程語言 » c語言數組malloc

c語言數組malloc

發布時間: 2022-07-15 11:12:11

『壹』 誰能解釋下malloc在c語言中的用法

malloc申請的空間是在"堆"上的

平時我們都是用聲明變數來申請空間的,此時申請到的空間是"棧"上的

棧上的空間, 不需要程序員負責釋放.
例如,在以下函數中
int go() {
int a;
int b[50];
}
在運行到go裡面時, 申請了4個位元組(int類型是4個位元組)的空間來放變數a, 4*50=200個位元組的空間來放變數數組b

在調用go時
// ...
go();
// ...

在運行到go()函數的里部,會申請相應的空間,但在退出go()以後,這些空間就會被廢棄.

這在有些時候不能夠滿足我們的需求,因而就要用到malloc和free
malloc申請的空間,要由我們程序員來負責釋放

int go() {
int* a;
a = malloc(sizeof(int));
}
這樣就在堆上申請到了4個位元組的空間了(sizeof(int)能夠得到int的大小, 返回4).

我們還可以
int* a;
a = malloc(100 * sizeof(int))
來申請到100個int的空間.

退出go以後,空間不會釋放.所以要用free來釋放.

『貳』 c語言:怎樣用malloc函數動態分配二維數組,使之可輸入數組的行數和每行的列數。

這個是可以的,但是和其他網友說的一樣,內存是線性的,當你在語言中分配一個多維數組的時候,編譯器其實也是分配線性內存的,但是我們可以通過模擬來實現類似數組的操作,下面演示一個分配以及操作數組的實例(列數要固定,這里假設列數為4):
int _tmain(int argc, _TCHAR* argv[])
{
int (*p)[4] = (int (*)[4])0;
int row = 3;
int (*mem)[4] = (int (*)[4])0; // 定義數組首指針
mem = (int (*)[4])malloc(sizeof(int(*)[4]) * row); // 分配row行, 4列的數組
// 分別為二維數組的第一維各個元素賦值。
mem[0][0] = 1;
mem[0][1] = 2;
mem[0][2] = 3;
mem[0][3] = 4;
// 列印二維數組的各個元素的值
printf("%d, %d, %d, %d", mem[0][0], mem[0][1], mem[0][2], mem[0][3]);
free(mem);
return 0;
}

不過這里列數必須指定,還有一種方法,這種方法可以保證用戶輸入任意行或列,而不必要將列數定死,演示如下:

int getElement(int* arr, int colNum, int row, int col);
void setElement(int* arr, int colNum, int row, int col, int val);

int _tmain(int argc, _TCHAR* argv[])
{
int *arr = (int*)0;
int row = 3;
int col = 5;
//分配 row 行 col 列的整形數組
arr = (int*)malloc(sizeof(int) * col * row);
// 將最後一個元素值設置為100
setElement(arr, col, 2, 4, 100);
//輸出最後一個元素的值
printf("%d", getElement(arr, col, 2, 4));
free(arr);
return 0;
}
//各個參數說明如下:
//arr: 數組首地址
//colNum:數組列數
//row: 要取得的元素所在行
//col: 要取得的元素所在列
int getElement(int* arr, int colNum, int row, int col)
{
return *(arr + sizeof(int) * (row - 1) * colNum + col);
}

// 此函數用來設置指定行和列的元素的值:
//arr: 數組首地址
//colNum:數組列數
//row: 要取得的元素所在行
//col: 要取得的元素所在列
//val: 要設置的值
void setElement(int* arr, int colNum, int row, int col, int val)
{
*(arr + sizeof(int) * (row - 1) * colNum + col) = val;
}

其實歸根到底,還是對指針的操作,希望可以幫到你,呵呵。

『叄』 C語言中的malloc函數用法>

C語言中malloc是動態內存分配函數。

函數原型:void *malloc(unsigned int num_bytes)。

參數:num_bytes 是無符號整型,用於表示分配的位元組數。

注意:當內存不再使用時,應使用free()函數將內存塊釋放。函數返回的指針一定要適當對齊,使其可以用於任何數據對象。關於該函數的原型,在以前malloc返回的是char型指針,新的ANSIC標准規定,該函數返回為void型指針,因此必要時要進行類型轉換。

實現malloc的方法:

首先我們要確定所採用的數據結構。一個簡單可行方案是將堆內存空間以塊的形式組織起來,每個塊由meta區和數據區組成,meta區記錄數據塊的元信息(數據區大小、空閑標志位、指針等等)。

數據區是真實分配的內存區域,並且數據區的第一個位元組地址即為malloc返回的地址 。

『肆』 在C語言中如何使用malloc動態申請一維數組

malloc()函數用來動態地分配內存空間,其原型為:void*malloc(size_tsize);

描述:

(參數描述)

Size是以位元組為單位分配的內存空間量。

【功能描述】

Malloc()在堆中分配指定大小的內存空間來保存數據。函數執行後,此內存空間未初始化,且其值未知。如果希望在分配內存的同時進行初始化,可以使用calloc()函數。

(返回值)

分配成功時返回指向內存的地址,失敗時返回NULL。

操作:

由於在請求內存空間時,可能有內存空間,也可能沒有內存空間,所以在繼續之前,您需要自己決定應用程序是否成功。

如果size的值為0,返回值可能為NULL,也可能不為NULL,這取決於標准庫實現,但是不應該再次引用返回的指針。

注意:函數的返回值類型為void*,Void並不意味著沒有返回值或空指針,而是返回的指針類型未知。所以當你使用malloc()時,你通常需要將void指針轉換成你想要的類型,例如:

# include < stdlib。H >

TypedefintListData;

ListData*數據;//存儲空間的基本地址

Data=(ListData*)malloc(100*sizeof(ListData));

(4)c語言數組malloc擴展閱讀:

實現malloc的方法:

(1)數據結構

首先,我們要確保數據結構。一個簡單可行的解決方案是將堆內存空間組織成塊,每個塊由一個元區域和一個數據區域組成,元區域記錄關於數據塊的元數據(數據區域大小、空閑標志位、指針等)。

數據區域是實際分配的內存區域,數據區域的第一個位元組地址是malloc返回的地址。

(2)找到正確的街區

現在考慮如何在區塊鏈中找到合適的區塊。一般來說,有兩種搜索演算法

Firstfit:從頭開始,使用第一個大於所需大小的數據塊稱為已分配的塊

最佳匹配:從頭開始遍歷所有塊,使用數據區域大小大於大小且分配的塊的差異最小的塊

最適合的有一個高的有效載荷和第一個適合有一個高的操作效率。這里我們使用第一個fit演算法。

(3)創建一個新的塊如果現有的塊都不能滿足size的要求,則需要在列表的末尾創建一個新的塊。

(4)分塊先拼裝有一個致命的缺點,那就是它可能允許較小的尺寸占據一個較大的塊。在這種情況下,為了改進有效負載,當剩餘的數據區域足夠大時,應該將其劃分為一個新的塊。

(5)malloc的實現

通過上面的代碼,我們可以實現一個簡單的malloc。注意,首先我們需要定義鏈表的第一個塊,first_block,初始化為NULL;此外,我們需要至少剩下的空間BLOCK_SIZE+8來執行除法操作

因為我們需要malloc分配數據區域在8位元組處對齊,所以大小不適用於8個倍數,所以我們需要調整大小,使其大於8的最小倍數的大小。

熱點內容
php獲取當前年 發布:2025-02-02 01:50:41 瀏覽:155
sqlbrowser服務 發布:2025-02-02 01:32:14 瀏覽:730
jeecg源碼下載 發布:2025-02-02 01:08:47 瀏覽:365
多台電腦能共用一個伺服器嗎 發布:2025-02-02 01:08:44 瀏覽:26
oppo雲存儲空間怎麼清理 發布:2025-02-02 00:59:31 瀏覽:263
項目編譯啥意思 發布:2025-02-02 00:25:13 瀏覽:223
逐鹿中原怎樣做掛機腳本 發布:2025-02-02 00:23:39 瀏覽:28
安卓系統跟蹤在哪裡 發布:2025-02-02 00:23:38 瀏覽:899
安卓uc瀏覽器怎麼安裝油猴 發布:2025-02-02 00:23:38 瀏覽:299
中商情報網資料庫 發布:2025-02-02 00:09:26 瀏覽:533