1、void * malloc(unsigned int size)
malloc爲動態內存分配,申請一塊連續的指定大小的內存塊區域以void*類型返回分配的內存區域地址;
- 函數頭文件:#include<stdlib.h>
- 申請得到的爲連續的存儲空間,如果分配失敗,則返回一個空指針(NULL)
- 返回的指針類型:void*(未確定類型的指針),也爲空間首地址
- 函數參數爲指定的字節數
- 最後用free()函數釋放內存(free釋放內存問題)
- malloc(0)屬於合法語句,它能返回一個合法的指針(有一說法是,當malloc分配內存時它除了分配我們指定SIZE的內存塊,還會分配額外的內存來存儲我們的內存塊信息,用於維護該內存塊)
#include<stdio.h>
#include<stdlib.h>
void main()
{
char *p;
p = (char*)malloc(100*sizeof(char)); //sizeof獲取字節數
if(p==NULL)exit(-1); //如果分配空間失敗,0爲正常退出,其他爲非正常退出
printf("輸入一串字符:");
scanf("%s",p);
printf("\n輸出:%s\n",p);
free(p);
p = NULL;
}
2、void *realloc(void *ptr, size_t size);
指針名=(數據類型*)realloc(要改變內存大小的指針名,新的大小),首先判斷ptr指向的區域是否有足夠的空間,如果有,則增大(或減少)該內存區域,然後將ptr返回;如果ptr指向的區域沒有足夠的空間,則分配一段新的內存區域,並且將原ptr的數據拷貝到新的內存區域,釋放ptr指向的內存區域(內部完成,不需要外部使用free),同時返回新分配的內存區域的首地址。即重新分配存儲器塊的地址
- 函數頭文件:#include<stdlib.h>
- 改變的區域可以比舊內存區域大或小
- 如果分配失敗,則返回空指針NULL(此時ptr所指的舊內存區域並沒有被釋放,需要用free函數釋放這一部分內存,因此不能直接賦值給ptr,這樣將導致ptr指針變爲空指針,使舊內存區域無法得到釋放 )
char* Dilatation(char* p,int n)
{
char* q;
q = (char*)realloc(p,n*sizeof(char));
if(!q)
{
free(p); //如果返回爲空指針,則釋放原來的舊地址內存
}
return q;
}
3、void* calloc(unsigned int num,unsigned int size)
在內存的動態存儲區中分配num個長度爲size的連續空間;
注意:num:對象個數,size:對象佔據的內存字節數,相較於malloc函數,calloc函數會自動將內存初始化爲0
#include<stdio.h>
#include<stdlib.h>
int main()
{
char*str = NULL;
str = (char*)calloc(10,sizeof(char));
printf("String is %s\n",str);
free(str);
return 0;
}