自動分配內存:當定義以基本類型的變量的時候,系統會地方為這個變量自動分配內存,這個 內存在堆上。當作用域結束,系統會自動將這個內存回收。
動態分配內存:開發人員自己向系統申請的內存空間,申請的內存位于棧上,當作用于結 束之后,系統是不會自動收回內存的。這個內存必須由開發人員自己去釋 放。如果不釋放,就內存泄露了。用“free(void *)這個函數進行釋放,這里值得注意的是free的參數必須為指針,并且是動態內存分配的。
△什么時候需要動態分配內存?
程序運行過程中,需要保存/記錄相應的數據,但是又沒有提前準備好內存,那么就需要臨時動態分配內存。
△使用函數:
void *malloc(size_t);
size_t: 希望申請的內存空間(字節byte)
void * :系統一開始不知道你需要存放什么數據,不同的數據需要的內存空間不一樣,所以默認就是給一個void *,泛指所有指針類型(char *, int *, struct *),當在使用的時候必須將void *轉化為相應的類型。如果沒有申請成功,那么返回值為NULL。
所以每次申請內從空間之后都要檢驗是否成功開辟內存空間。
△計算結構體內存空間
原理:如果結構體內部擁有多種數據類型,那么以占據內存字節數最高的類型對齊
typedef struct{
char *name;
int age;
}Person;//16
char * 占據8個字節, int 占據4個字節
所以age變量自動向name對齊。整個占據16個字節
typedef struct{
char name;
int age;
}Person;//8
typedef struct{
char name[2];
int age;
}Person;//8
typedef struct{
char name[6];
int age;
}Person;//12
P.S.①指針變量默認都要賦初值,如果沒有則為NULL,這是因為防止野指針的出現。
②函數中盡量不要返回指針。
動態內存分配realloc
具體函數:void *realloc(void *, size_t) 其中,第一個『void *』是指返回重新分配的內存空間的首地址;第二個『void *』指針只想的內存區域必須是malloc分配過的;『現在總共需要多少內存空間』。這里需要注意的是,如果realloc沒有獲取到內存空間,那么必須對之前的內存進行釋放。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char * argv[]) {
char *name = NULL;
char temp;
int total = 0;
while (1) {
//從終端獲取一個字符
temp = getchar();
//判斷這個字符是不是回車鍵\n
if (temp == '\n') {
break;
} else{
//為這個字符添加一篇內存空間
//判斷是不是第一次分配內存空間
if (name == NULL) {
//第一次
name = (char *)malloc(1 * sizeof(char));
if (name == NULL) {
exit(EXIT_FAILURE);
}
} else{
//不是第一次,需要在之前的內存空間里面添加 一個字符的空間
char *pTemp = NULL;
pTemp = (char *)realloc(name, (total+1)*sizeof(char));
if (pTemp == NULL) {
//釋放掉之前的內存空間
free(name);
exit(EXIT_FAILURE);
}
name = pTemp;
}
//保存這個字符
*(name + total) = temp;
total++;
}
}
printf("%s\n", name);
free(name);
return 0;
}