malloc
1开辟成功,返回一个指针
2开辟失败,返回NULL
3返回值是void*,需要强制转换
4size为0未定义。
int main()
{//向内存申请10个整形空间
int* p = (int *)malloc( sizeof(int));
if (p == NULL)
printf("%s\n", strerror(errno));
else
{
int i = 0;
for (i = 0; i < 10; i++)
{
p[i] = i;
printf("%d", p[i]);
}
}
//释放内存
free(p);
//将p的地址弄成0
p = NULL;
return 0;
}
free
1释放动态开辟的空间
2free(0)可以实现
colloc
1会初始化空间为0
int main()
{
int* p = (int*)calloc(10, sizeof(int));
if (p == NULL)
printf("%s\n", strerror(errno));
else
{
int i = 0;
for (i = 0; i < 10; i++)
{
p[i] = i;
printf("%d", *(p+i));
}
}
free(p);
p = NULL;
return 0;
}
realloc
1可以调整开辟空间
2返回void*,需要强制转换
注意:p指向的空间后面有足够的空间,直接申请足够的空间。返回p的地址
若没有足够的空间,释放旧的空间,拷贝数据,重新开辟新的空间。
int main()标签:p2,10,函数,int,动态内存,printf,空间,NULL From: https://blog.51cto.com/u_15770447/5910079
{
int* p = (int*)malloc(5* sizeof(int));
if (p == NULL)
printf("%s\n", strerror(errno));
else
{
int i = 0;
for (i = 0; i < 5; i++)
{
p[i] = i;
}
}
//添加20个字节
int i = 0;
int* p2 = (int*)realloc(p, 40);
//防止扩大失败,改地址
//成功后二者地址相同
if (p2 != NULL)
p = p2;
for (i = 0; i < 10; i++)
{
if (i >= 5)
p2[i] = i;
printf("%d ", p2[i]);
}
free(p);
p = NULL;
return 0;
}