1.malloc:为一系列元素分配一组内存块。
当开辟成功时返回内存块的地址,开辟失败则返回空指针NULL
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main()
{
int n = 0;
scanf("%d", &n);
//malloc申请内存空间
int* p = (int*)malloc(n * sizeof(int));
if (p == NULL)
{
//打印错误原因的一个方式
printf("%s\n", strerror(errno));
}
else
{
//正常使用
int i = 0;
for (i = 0; i < n; i++)
{
*(p + i) = i;
}
for (i = 0; i < n; i++)
{
printf("%d ", *(p + i));
}
}
//当动态申请的空间不在使用的时候
//就应该还给操作系统
free(p);
p = NULL;//释放内存后应该置为空指针
return 0;
2.calloc:为一系列元素分配一组内存块,并将所有位初始化为零。
当开辟成功时返回内存块的地址,开辟失败则返回空指针NULL
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
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++)
{
//calloc自动把元素初始化为0
printf("%d ", *(p + i));
}
}
//释放空间
//free是用来释放动态开辟的空间的
free(p);
//释放空间应把p置为空指针
p = NULL;
return 0;
}
realloc:当开辟的动态内存空间不够时,为开辟的动态内存空间扩展空间。
当开辟成功时返回内存块的地址,开辟失败则返回空指针NULL。
1.如果p指向的空间后有足够的内存空间可以追加,则直接追加,返回p
2.如果p指向的空间后没有足够的内存空间可以追加,则realloc函数会重新找一个新的内存区域,开辟一块满足需求的空间,并且把原来内存中的数据拷贝回来,释放旧的内存空间,最后返回新开辟的内存空间地址
3.得用一个新的变量来接受realloc函数的返回值
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main()
{
//malloc申请内存空间
int* p = (int*)malloc(20);
if (p == NULL)
{
//打印错误原因的一个方式
printf("%s\n", strerror(errno));
}
else
{
//正常使用
int i = 0;
for (i = 0; i < 5; i++)
{
*(p + i) = i;
}
}
//更改指向的内存块的大小。
//1.如果p指向的空间后有足够的内存空间可以追加,则直接追加,返回p
//2.如果p指向的空间后没有足够的内存空间可以追加,则realloc函数会重新找一个新的内存区域,
//开辟一块满足需求的空间,并且把原来内存中的数据拷贝回来,释放旧的内存空间,最后返回新开辟的内存空间地址
//3.得用一个新的变量来接受realloc函数的返回值
int* ptr = realloc(p, 40);
if (ptr == NULL)
{
//追加失败
//错误处理
}
else
{
//追加成功
p = ptr;
int i = 0;
for (i = 5; i < 10; i++)
{
*(p + i) = i;
}
for (i = 0; i < 10; i++)
{
printf("%d ", *(p + i));
}
}
//释放空间
free(p);
//重置指针
p = NULL;
ptr = NULL;
return 0;
}