1. 程式人生 > >c的記憶體分配

c的記憶體分配

什麼是程序?

通俗得說:程序就是一個正在執行的程式

計算機如何給程序分配記憶體?

計算機記憶體可以分為如下四區

1.zhan區 (臨時變數儲存區)
2.堆區 (動態分配的變數)
3.資料區 (常量,靜態臨時變數)
4.程式碼區(指令/函式)

程式原始碼經過編譯,最終成一堆的 資料 和一堆的 指令

當一個程序被開啟時,計算機將為該程序分配 1.zhan區 2.資料區 3.程式碼區 這三個區在編譯時已經可以確定其大小

函式為單位的指令存放在程式碼區
常量,巨集,靜態臨時變數存放在資料區
普通臨時變數存放在zhan區

堆記憶體可以為多個程序提供儲存空間。

可以通過 malloc(位元組數)申請堆記憶體
通過free(malloc返回的指標) 釋放記憶體,(記得將釋放記憶體的變數指為NULL)

什麼時候要動態分配記憶體?

  1. 寫程式碼時不能確定記憶體大小時
  2. 所需要空間太大時(>512位元組)

c程式碼中的陣列存在zhan中還是堆中?

  1. 寫程式碼時手動宣告定義的陣列,存在zhan中
  2. 寫程式碼時呼叫類庫申請分配空間得到的陣列,存在堆中

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 可以確保重疊 也正確拷貝。