1.malloc
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
int main()
{
int n,i;
scanf("%d",&n);
int* p=(int*) malloc(n*sizeof(int));
if(p==NULL)
{
printf("%s\n",strerror(errno));
}
else
{
for(i=0;i<=n-1;i++)
{
*(p+i)=i;
printf("%d ",*(p+i));
}
}
free(p);
}
2.void*calloc(num,size)
为num个大小为size的元素开辟空间 每个字节初始化为0
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
int main()
{
int n,i;
scanf("%d",&n);
int* p=(int*) calloc(n,sizeof(int));
if(p==NULL)
{
printf("%s\n",strerror(errno));
}
else
{
for(i=0;i<=n-1;i++)
{
printf("%d ",*(p+i)); //输出全为0
}
}
free(p);
}
3.realloc
void*realloc(void*ptr,size)
注意事项:如果p指向的空间后有足够的内存空间可以追加,则直接追加,返回p
否则,重新找一块新的内存区域开辟新的满足需求的空间,拷贝原内存数据,自动释放旧内存空间,返回新开辟内存空间的地址
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
int main()
{
int i;
int* p=(int*) calloc(5,sizeof(int));
if(p==NULL)
{
printf("%s\n",strerror(errno));
}
else
{
for(i=0;i<=4;i++)
{
*(p+i)=i;
printf("%d ",*(p+i));
}
}
int*p2=(int*)realloc(p,20);
if(p2!=NULL)
{
p=p2;
}
for(i=5;i<=9;i++)
{
*(p+i)=i;
printf("%d ",*(p+i));
}
free(p);
}
4.常见错误
1.对非动态内存free
2.对空指针进行解引用操作
3.越界访问
4.*p++ =i free(p) 不再指向起点
*(p+i)=i 可free(p)