陣列 靜態分配連續記憶體空間

2021-06-06 14:02:20 字數 1087 閱讀 7092

1、用陣列靜態獲得一段連續的儲存空間,大小當然有限制了。

理論上來說沒有限制,但是核心一般配置允許每個程序擁有有限的記憶體空間,可以用系統呼叫函式getrlimit(int resource, struct rlimit *rlim)獲得系統的資源限制。系統的資源限制分為軟體限制和硬體限制,軟體限制最大值不能超過硬體限制。陣列靜態獲得的儲存空間是分配在stack,只要知道stack的限制就知道答案了。可以使用如下**獲得:

struct rlimit resource_limit;

getrlimit(rlimit_stack, &resource_limit);

printf("stack: soft_limit - %ld hard_limit - %ld\n", resource_limit.rlim_cur, resource_limit.rlim_max);

我的系統上軟體限制是10485760byte,已經足夠了。

2.分配大數量的陣列,若是系統找不到該大小的一段連續的儲存空間,系統就會產生乙個sigsegv訊號,這時呼叫函式int sigaltstack(const stack_t *ss, stack_t *oss)來處理這個訊號。sigaltstack儲存訊號sigsegv到乙個alternate stack結構ss中,核心會先於程序執行前檢查這個訊號。

補充:至於你說的malloc限制為65536byte,可能有些片面,我的系統上申請500m都沒有問題^_^當然這和系統限制有關,因為我使用了ulimit -c unlimited命令取消了限制。但是就32系統來說一般預設限制最低是16m,最大是64m,可以用ulimit -d命令改變限制範圍。

樓上說的是普通的區域性變數的陣列吧,要是靜態的或者全域性的陣列,就應該不是stack的限制了吧

確實是只針對普通的區域性變數的陣列,對於靜態的或者全域性的陣列的空間分配是在data段。unix/linux32位系統使用者使用虛擬記憶體最多可以3g,實際上data段+heap段+text段占有的最大空間是0x08048000~0x40000000,除去heap段和text段以外,就是data段的空間,當然就是理論上能獲得的靜態的或者全域性的陣列的最大空間。heap段占用的空間就是malloc系列函式申請的空間,至於text段占有的空間相對較小,可以忽略^_^

分配記憶體空間

void calloc size t nobj,size t size 分配足夠的記憶體給nobj個大小為size的物件組成的陣列,並返回指向所分配區域的第乙個位元組的指標 若記憶體不夠,則返回null.該空間的初始化大小為0位元組.char p char calloc 100,sizeof cha...

記憶體空間與分配

1 記憶體分配錯誤 動態記憶體分配錯誤有兩種基本型別 記憶體錯誤和記憶體洩漏。1 記憶體錯誤 當乙個指標或者該指標所指向的記憶體單元成為無效單元,或者記憶體中分配的資料結構被破壞時,就會造成記憶體錯誤。指標未被初始化,指標被初始化為乙個無效位址,指標被不小心錯誤地修改,在與指標相關聯的記憶體區域被釋...

C C 分配記憶體空間

方法 c malloc calloc realloc free c new delete 函式原型 請求成功返回空間首位址,失敗返回 null include void malloc size t size 分配size位元組的連續記憶體,不負責初始化,使用memset初始化。void calloc...