【12】動態記憶體之malloc、calloc、realloc、free函式
阿新 • • 發佈:2019-02-09
建立動態記憶體:int *p = (int *) malloc(n*sizeof(int));
#include<stdio.h> #include<stdlib.h> #include<assert.h> // #include<vld.h> int main() { int *p = (int *)calloc(10,sizeof(int)); //這兩種表達方式一樣 int *pp = (int *)malloc(10*sizeof(int)); printf("calloc申請空間值:\n\n"); for(int i = 0; i < 10; i++) { printf("%d ", *p++); } printf("\n\n\n\n"); printf("malloc申請空間值:\n\n"); for(int i = 0; i < 10; i++) { printf("%d ", *pp++); } return 0; }
malloc函式:
void *malloc(
size_t size
);
size是指其分配的位元組,即要申請的空間大小,以32位系統為例:int *p = (int *) malloc(10*sizeof(int));即一次申請一個40Byte的連續空間,並將其強轉位int型別,賦值給指標p,那麼此時記憶體地址是隨機的。
calloc函式:
void *calloc(
size_t num,
size_t size
);
num是指元素的數目,size是位元組長度的每個元素,它的返回值指向該分配空間,比如說若果他要申請10個int或者其他型別的空間,表示如下:int *p = (int *) calloc(10, sizeof(int)),不需要人為計算。且calloc將申請的空間逐一初始化,所有元素置0
realloc函式:
void *realloc( void *memblock, size_t size );
memblock是對以前指定的指標記憶體塊,size是新的大小(以位元組為單位),主要是對動態記憶體進行擴容操作。
free函式:
void free(
void *memblock
);
主要作用是釋放記憶體塊,free使用不恰當時候就會面臨崩潰,他的崩潰有四個原因:
(1)越界
int main() { int *p1 = (int *)malloc(20); for(int i=0;i<20;i++) { p1[i] = 0; } free(p1); return 0; }
(2)指標移動(找不到頭)
int main()
{
int *p = (int *)malloc(10*sizeof(int));
for(int i=0;i<10;i++)
{
*p = 0;
p++;
}
free(p);
return 0;
}
(3)重複釋放記憶體
int main()
{
int *p = (int *)malloc(10*sizeof(int));
int *q = p;
free(p);
free(q);
return 0;
}
(4)釋放的不是動態建立的記憶體
int main()
{
int a = 10;
free(&a);
return 0;
}