code:
#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
/*
1 malloc:分配得到的内存空间是未初始化的,因此一般在使用该内存空间时,要调用另一个函数memset来将其初始化为全0
2 calloc:会将所有的元素初始化为 0
3 realloc:改变已经被分配给一个指针的内存的长度
4 free:函数只是释放指针指向的内容,而该指针仍然指向原来指向的地方,此时,指针为野指针,
如果此时操作该指针会导致不可预期的错误。安全做法是:在使用free()函数释放指针指向的空间之后,将指针的值置为NULL。
*/
void myprint(int *p,int n){
for(int i=0;i<n;i++){
cout<<p[i]<<endl;
}
}
void myprint(float *p,int n){
for(int i=0;i<n;i++){
cout<<p[i]<<endl;
}
}
int main()
{
//1 malloc
int *p = (int*)malloc(5*sizeof(int)) ;
if (NULL == p)
{
printf("Error in malloc.\n");
return -1;
}
cout<<"malloc:"<<endl;
myprint(p,5);
//使用memset函数来初始化malloc函数分配的空间
memset(p,0,5*sizeof(int));
cout<<"init by memset:"<<endl;
myprint(p,5);
//2 calloc
float *p2 = (float*)calloc(5,sizeof(float));
if (NULL == p2)
{
printf("Error in calloc.\n");
return -1;
}
cout<<"calloc:"<<endl;
myprint(p2,5);
//3 realloc
int *p3 =(int*)malloc(sizeof(int));
/*
void * realloc(void * p, size_t n);
其中,指针p必须为指向堆内存空间的指针,
即由malloc()函数、calloc()函数或realloc()函数分配空间的指针;
realloc()函数分配的空间也是未初始化的。
*/
int *p4 =(int*)realloc(p3,5*sizeof(int));
//realloc操作可能失败(return NULL), 所以需要先检验,再将其赋值给目标指针
if(p4!=NULL)
{
p3=p4;
}
cout<<"realloc:"<<endl;
myprint(p3,5);
//释放空间,避免内存泄露
{
free(p);
free(p2);
free(p3);
free(p4);
p=NULL;
p2=NULL;
p3=NULL;
p4=NULL;
}
return 0;
}
运行结果:
部分内容参考网址: