C語言,不得不重視的記憶體分配

2021-06-23 05:34:33 字數 2072 閱讀 8266

儲存區的劃分:

(1)棧區:棧區儲存區域性變數,棧區的記憶體是由系統自動管理,系統開闢,系統**,無需程式設計師管理.

(2)堆區:通過堆區記憶體分配函式,分配的空間都在堆區,堆區的最大特點:堆區的空間需要程式設計師手動管理,手動開闢,手動釋放.(oc常用)

(3)常量區:對於字元常量,整型常量,浮點型常量,字串常量統一儲存在該區,該區的記憶體由系統自動管理,特點:常量去的內容不能修改

(4)靜態區,全域性區:儲存全域性變數,以及靜態變數.記憶體由系統管理但是在程式的執行期間空間都不會釋放

(5)**區:編譯之後形成的cpu指令儲存在該區

概念:區域性變數:在函式內部定義的變數,陣列.(棧區)

全域性變數:在函式外部定義的變數,陣列.(全域性區)

靜態變數:由static修飾的變數.(靜態區)

棧區記憶體的錯誤使用方式

棧區的記憶體位址不能作為函式的返回值

原因(season):棧區的內存在函式執行完畢之後空間已經被系統**,不能再訪問

解決方案:讓空間在函式執行完畢之後系統不**空間即可,定義成全域性變數,或者靜態變數.或者在堆區開闢空間

1.野指標錯誤

產生原因:訪問不該訪問(已經沒有使用權,空間已經釋放還給系統)的記憶體

解決方案:釋放記憶體的所有權的同時,將位址也清除掉.

p = null;//指向無效的空間

2.過度釋放

產生原因:對一塊記憶體釋放(free)多次

解決方案:保證只釋放(free)一次,將其他的釋放操作刪除掉.(過度釋放會立即crash)

3.記憶體洩漏

產生原因:分配了記憶體,使用完之後,沒有釋放掉,造成記憶體堆積,最後會因為沒有記憶體可分配,而造成程式crash

解決方案:記憶體使用完之後立即釋放掉

/其他記憶體分配函式

calloc(n, size)  分配n塊,size大小的空間

calloc 和 malloc相比,calloc分配完空間之後,將資料清除,空間清零

整形陣列大小的空間,由5個元素

int *p = calloc(5, 4);// 分配20個位元組(連續), 分配完之後對分配空間清零,也就是申請的記憶體空間會初始化成  0

realloc(位址, newsize),給定乙個位址,從該位址開始按新的記憶體空間大小重新分配./*

malloc(<#size_t#>)

realloc(<#void *#>, <#size_t#>)

calloc(<#size_t#>, <#size_t#>)

都是用在堆區 */

記憶體操作函式, 既可以用於堆記憶體也可以用於棧記憶體

/**void *memset(void *s, int c, size_t n); 可以用在棧區,也可以用在堆區

s開始,長度為n的所有位元組賦值為c

通常用於清除結構體或者陣列資料.

例如student *p = calloc(5, sizeof(student));

memset(p, 0, sizeof(student));

void *q = malloc(100);

memset(q, 0, 100);//清零操作, */

/***void *memcpy(void *dest, const void *source, size_t n);

從source拷貝n個位元組到dest中

例如:

student *p = malloc(sizeof(student));

strcpy(p->name, "zhangsan");

p->age = 20;

student *q =malloc(sizeof(student));

memcpy(q, p, sizeof(student)); */

/***  int memcmp(const void *buf1,const void *buf2, unsigned int count);

記憶體比較結果分為 >0  <0  =0

const void *buf1  const void *buf2  兩個比較體

每個位元組每個位元組相比

unsigned int count比較次數

*/

不得不重視的問題 資訊太多!資訊太雜!

原文出處 http www.cnblogs.com zhouyinhui archive 2008 12 03 1346867.html 這段時間一直為這個問題所煩惱,在我獨自尋求解決方案的同時,也很想聽聽大家的經驗與意見。不過注意討論範圍 是個人,不是團隊,但不妨借助團隊經驗。所謂資訊太多太雜即是...

討論 不得不重視的問題 資訊太多!資訊太雜!

討論 不得不重視的問題 資訊太多!資訊太雜!周銀輝所謂資訊太多太雜即是 每天我們將接收到很多很多的資訊 資料 計畫等等 下文統稱 資訊 如何處理這些資訊,如何儲存這些資料,如何跟蹤這些計畫變得尤為重要。否則,多較長一段時間後,很多資料丟失了,計畫沒有得以跟蹤而被耽誤了,即便沒有丟失,查詢起來也很不方...

構建大資料網路不得不重視的6個問題

在我們考慮大資料時,我們注意到了 大 這個字,但是在建設基礎架構時,我們還應該注意 分布式 事實上,大資料應用程式需要處理大規模資訊,而且在出於彈性的考慮將資料複製到多個位置時,資訊的規模變得越來越大。但是,大資料的最重要屬性並不在於它的規模,而在於它將大作業分割成許多小作業的能力,它能夠將處理乙個...