Linux C幾種申請記憶體的操作

2021-10-23 02:32:54 字數 1710 閱讀 7237

from c語言中文網

void

*malloc

(size_t size)

最常用贅述

void

*calloc

(size_t numelements, size_t sizeofoneelement)

申請的記憶體區域會先清零,記憶體大小 = numelements * sizeofoneelement

void

*realloc

(void

*ptr, size_t size)

ptr重新分配記憶體空間,size為新的記憶體空間大小。

size可比原來的大或小,也可以一樣(很無聊才會這麼幹吧)。

如果size==0,原來的ptr被釋放,但是新空間又沒有,相當於free(ptr)

如果ptr==null,相當於malloc(size)

【注意】

返回的新位址可能仍為ptr也可能不是了(size比原來大且沒有後續沒有空間擴充套件的時候),所以呼叫此函式後不可以再用原來的ptr(已被**),改用返回值,當然如果返回null,也就是分配失敗,ptr還是可用的。

原來ptr裡的內容會在新的位址上被繼承,當位址變化後函式會把原來ptr裡的內容拷貝到新位址。

ptr只能是申請出來的指標,簡單理解就是必須為malloc/calloc/realloc函式的返回值。

from

void

*kmalloc

(size_t size, gfp_t flags)

申請一塊連續物理記憶體(為什麼說連續?與vmalloc相對應)。

size< 128kb

flags簡單的參考上方引用,更加詳細複雜的自行搜尋。

釋放記憶體用kfree()

void

*kzalloc

(size_t size, gfp_t flags)

比kmalloc多了記憶體塊清零的操作。

釋放記憶體用kfree()

void

*vmalloc

(size_t size)

kmalloc區別在於不要求物理記憶體連續,但是虛擬記憶體都是連續的,所以沒有了kmallocsize限制,申請大空間就用這個。

釋放記憶體用vfree()

顯而易見這個沒有flag,可以被阻塞,所以不能在中斷上下文使用

linux C語言 記憶體申請 堆 棧 大小限制

一直都有乙個疑問,乙個程序可以使用多大的記憶體空間,swap交換空間以及物理記憶體的大小,ulimit的stack size對程序的記憶體使用有怎樣的限制?今天特親自動手實驗了一次,總結如下 開闢一片記憶體空間有2種方式,第一種 int a 第二種malloc,那麼在linux下,這兩種方式可以開闢...

DPDK記憶體(二)記憶體申請操作

eal提供了乙個malloc api用於申請任意大小記憶體。這個api的目的是提供類似malloc的功能,以允許從hugepage中分配記憶體並方便應用程式移植。通常,這些型別的分配操作不應該在資料面處理中進行,因為他們比基於池的分配慢,並且在分配和釋放路徑中使用了鎖操作。但是,他們可以在配置 中使...

linux c 位元組對齊申請記憶體與位元組對齊陣列宣告

查詢當前系統cache line大小 cat sys devices system cpu cpu1 cache index0 coherency line size 函式 void memalign size t boundary,size t size 標頭檔案stdlib.h 函式memali...