標籤:des style class blog code tar
動態記憶體分配
一、儲存區劃分
從低到高(記憶體位址小----記憶體位址大) : 代碼區---常量區---靜態區---堆區---棧區
棧記憶體
//凡是在函數體內定義的變數 都儲存在棧區(包括形參)。 int a = 10;//a也是在棧地區裡面 float b = 1.5;//b也是在棧地區裡面 char c = ‘b‘; double d = 3.14; printf("%p %p %p %p\n",&a,&b,&c,&d); //棧的特點先進後出,先定義的變數先入棧,後定義的變數後入棧。 //調用函數時。函數中得變數會陸續入棧,函數調用結束時,變數陸續出棧 //棧區記憶體的分配與回收,有系統自動進行。
常量區
‘a’字元常量 5整型常量 “iphone” 字串常量
常量佔用記憶體 唯讀狀態 不能修改
靜態儲存區
static int a = 5;
1.只初始化一次 2.如果初始沒給值,預設為0 3.只有程式退出才釋放(永遠存在)
將變數定義的類型前加static 則該變數儲存在靜態儲存區
//編譯期就已經進入記憶體,程式運行期間h一直存在,不會被銷毀 ,程式結束時h才會被銷毀,如果沒有給h賦值,h預設初始值為0 static int h = 10;
#import <Foundation/Foundation.h>int m = 100;//定義在函數外面的變數稱為全域變數,全域變數跟靜態變數一樣,儲存在全域區(也叫靜態區)int main(int argc, const char * argv[]){
二、堆記憶體配置函數
堆記憶體 一般由程式員分配和釋放
malloc: void *malloc(unsigned int size);//void * 表示任意類型的指標
int * p = (int *)malloc(sizeof(int) * n);//(int *)強轉類型 sizeof(int)分配的記憶體大小 *n元素個數
char *str = malloc(8);
//malloc主要功能是從 堆區 開闢 指定大小 得記憶體空間 //記憶體大小以 位元組 為單位 //傳回值是這段空間的首位置 //我們需要定義一個指標儲存傳回值 int *p = malloc(4); //p在棧區。malloc操作的十堆區,p存的地址是堆區地址 int a = 10; int *q = &a; //a在棧區,q也在棧區,q存的a的地址,也就是棧區地址
strcpy(str, ”iPhone”);
free(str);//標記刪除,不清除內容
struct student{ char name[20]; int age; int num; char sex; }; typedef struct student Student; Student *pstu = malloc(sizeof(Student)*5); pstu->age = 20; free(pstu);//釋放記憶體,160個位元組歸還給系統
Student *p = malloc(sizeof(Student));//分配的記憶體大小要用 sizeof(Student)
void * calloc(unsigned n,unsigned size);//n記憶體個數 size大小 calloc 清空記憶體
//分配n個size大小的空間,並且把該記憶體上的所有位元組清零
void *realloc(void *p,unsigned newSize);//按新的長度重新分配
void *memset(void *s , int c , size_t n);//memset(p , 0 , sizeof(int) * 5) 通常用於清除結構體或者數組資料
//輸入三個學員的姓名,動態分配記憶體儲存學院姓名,並最後輸出 //定義一個包含3個字元指標的數組,他們預設指向null(0) char *names[3]={0}; //定義一個臨時數組,用於存放輸入的單個單詞 char temp[50] = {0}; for (int i = 0; i<3; i++) { scanf("%s",temp);//temp前面不要加&,因為數組名本身就是地址 //擷取單個單詞的長度 unsigned long length = strlen(temp); //讓指標指向開闢的堆空間 names[i] = malloc(length+1); //將輸入的內容拷貝到堆空間裡 strcpy(names[i], temp); } for (int i = 0; i<3; i++) { printf("%lu %s\n",strlen(names[i]),names[i]);free(names[i]);
}
void *memcpy(void *dest,const void *source,size_t n)