c的記憶體分配
阿新 • • 發佈:2018-11-06
什麼是程序?
通俗得說:程序就是一個正在執行的程式
計算機如何給程序分配記憶體?
計算機記憶體可以分為如下四區
1.zhan區 (臨時變數儲存區)
2.堆區 (動態分配的變數)
3.資料區 (常量,靜態臨時變數)
4.程式碼區(指令/函式)
程式原始碼經過編譯,最終成一堆的 資料 和一堆的 指令。
當一個程序被開啟時,計算機將為該程序分配 1.zhan區 2.資料區 3.程式碼區 這三個區在編譯時已經可以確定其大小
以函式為單位的指令存放在程式碼區
常量,巨集,靜態臨時變數存放在資料區
普通臨時變數存放在zhan區
堆記憶體可以為多個程序提供儲存空間。
可以通過 malloc(位元組數)申請堆記憶體
通過free(malloc返回的指標) 釋放記憶體,(記得將釋放記憶體的變數指為NULL)
什麼時候要動態分配記憶體?
- 寫程式碼時不能確定記憶體大小時
- 所需要空間太大時(>512位元組)
c程式碼中的陣列存在zhan中還是堆中?
- 寫程式碼時手動宣告定義的陣列,存在zhan中
- 寫程式碼時呼叫類庫申請分配空間得到的陣列,存在堆中
malloc free 模板
必須引入的庫
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
模板程式碼
int size = 10;
Type *p = NULL;
p = (Type *)malloc(size * sizeof(Type));
if (NULL==p){
/*沒有申請成功如何處理*/
}
memset(p, 0, size * sizeof(Type));
/**
自己業務程式碼
*/
free(p);
p = NULL;
memcpy , memmove
void *memcpy(void *dest, const void *src, size_t n);
void *memmove(void *dest, const void *src, size_t n);
兩者區別 點這裡
主要區別在於如何對待重疊,memmove 可以確保重疊 也正確拷貝。