動態記憶體分配

weixin_34402408發表於2017-07-19

1.記憶體劃分

5204748-4b5574c57de4dfe4.png

棧區:儲存區域性變數和函式引數(遵守先進後出規則。)

char *func(){
                   char string[ ] = “iphone”;
              //此處是把常量區的字串 “iphone” 拷貝到棧記憶體中
                 return string;//棧記憶體 返回是不安全的  禁止
               }

常量區:整型常量,字元常量 ,字串常量等 ( 常量佔用記憶體,只讀狀態,不可修改)
const修飾 const int a = 2;

靜態區(全域性區):static int a = 5;(變數之前加 static ,該變數會儲存在靜態區)
注意:
①只初始化一次,
②若初始化沒給值,預設值為0
③只有程式退出才釋放(永久佔用記憶體)
④全域性變數儲存在靜態區(花括號外面定義的變數)

堆區:malloc 等記憶體分配函式分配的記憶體(手動分配,手動釋放)

程式碼區:程式碼在編譯後轉換成二進位制存放的區域

2.動態記憶體分配

malloc的使用:
int *a  =  malloc(8);
Stu *b = malloc(sizeof(Stu)*5 );
記憶體釋放:
void free(void *)

3.其他記憶體分配函式

calloc:
void * calloc(unsigned n ,unsigned size);//分配n個size大小的空間,並清零
realloc:
void * realloc(void *p,unsigned newSize);//按給定的地址以及給定的大小分配記憶體

4.記憶體操作函式

初始化記憶體:
void *memset(void *s,int cmsize_t n);//從s指向的記憶體開始初始化n個位元組的內容為 c;
記憶體拷貝:
void memcpy(void *dest,const void *sourse,size_t n);//從source指向的記憶體開始拷貝到 dest ,拷貝n個位元組
記憶體比較:
int memcmp(const void *buf1,const *buf2,unsigned int count);//比較buf1和buf2指向的記憶體是否相等,比較count個位元組

相關文章