? ? 由于传统的内存开辟方式开辟的空间是固定大小的,使用起来不够方便,所以才有了动态内存开辟的方式。
? 动态内存管理的函数主要是:malloc? free? calloc? realloc
?malloc
void*
malloc
(
size_t
size
);
malloc函数向内存申请了一块连续可用的内存空间,并且返回指向这块空间的指针。如果开辟空间失败则会返回一个NULL指针。由于malloc函数不知道使用者要开辟空间的类型,所以它的返回值类型是void*,由使用者自己决定。函数的返回值是一个对象。
函数的用法:
int main()
{
int arr[10] = 0;//动态内存开辟
int*p = (int*)malloc(40);
if (p == NULL)
{
printf("%s\n",strerror(errno));
return 1;//如果空间开辟失败则会报错
}
//malloc使用
int i = 0;
for(i=0;i<10;i++)
{
*(p+i)=i;
}
for(i=0;i<10;i++)
{
printf("%d ",*(p+i));
}
return 0;
}
?
free?
当我们用完开辟的空间又不再需要使用后,我们就要归还开辟的空间,否则会导致内存泄漏,这个时候我们就要用到free函数来释放内存空间。只需要在后面加上以下代码。
free(p);
p = NULL;
但是,如果没有free,并不代表着内存空间就不回收了,当我们推出程序后,系统会自动回收内存空
?
calloc?
void* calloc (size_t num, size_t size);?
?calloc函数也是一个动态内存开辟的函数,而这个函数最特别的地方在于,它在返回之前初始化内存空间。函数的返回值是一个数组。
函数的用法:?
//开辟10个整形的空间
int main()
{
int* p = (int*)calloc(10, sizeof(int));
if (p == NULL)
{
printf("%s\n", strerror(errno));
return 1;
}
}
int i = 0;
for(i=0;i<10;i++)
{
printf("%d ", *(p+i));
}
free(p);
p = NULL;
return 0;
}
我们可以将calloc理解为malloc+memset=calloc
realloc
?而动态内存管理的核心其实是realloc函数,它能够使动态内存管理变得更加灵活,对内存的大小做灵活的调整。
void* realloc (void* ptr, size_t size);
其中的ptr是要调整的内存的地址
size是调整之后新的空间大小
?realloc在调整内存空间的是存在两种情况:
情况1:要扩展的内存直接在原有内存之后直接增加空间,原空间的数据不变。
情况2:当要扩展的空间后面没有足够的空间进行追加时,则会在堆空间中找一个合适大小的连续空间使用。这样元素就会拷贝到新的空间,旧的空间释放掉,返回的是新的地址。
函数的用法:
int main()
{
int*p = (int*)malloc(40);
if (NULL == p)
{
printf("%s \n", strerror (errno));
return 1;
//使用
//12345678910
int i = 0;
for (i = 0; i < 10; i++)
{
*(p + i) = i + 1;
}
//扩容
int* ptr = realloc(p, 80);
if (ptr != NULL)
{
p = ptr;
}
for(i=0;i<10;i++)
{
printf("%d ", *(p+i));
}
free(p);
p = NULL;
return 0;
}
realloc也能够实现和malloc一样的功能
int main()
{
realloc(NULL, 40);//malloc(40);
return 0;
}
?希望本篇文章能够有所帮助,如有疑问,欢迎指出。
|