动态内存函数介绍:
动态内存分配:指在程序执行的过程中动态地分配或者回收储存空间的分配内存的方法。
动态内存分配不像数组等静态分配方法那样需要预先分配储存空间,
而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。
头文件:#include
malloc 与 free
malloc:
void* malloc(size_t size);
这个函数向内存申请一个连续可用的空间,并返回这块空间的指针。
————如果开辟成功,则返回一个指向开辟好空间的指针
————如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要检查
————返回值的类型是void*(指针) ,所以malloc不知道开辟空间的类型
————malloc分配的内存大小至少为size参数所指的字节数
free:
void free (void* ptr);
malloc 与 free函数是配对的,如果是申请后不释放就是内存泄漏
————如果参数ptr指向的空间不是动态开辟的,那么free函数行为是未定义的
————如果参数是NULL,free函数什么都不做
calloc 与 realloc
calloc:
void* calloc (size_t num, size_t size);
————函数功能是为num个大小为size的元素开辟空间,并且把空间每个字节初始化为0
————malloc 与 calloc 的区别只在于calloc会在返回地址之前把申请的空间每个字节初始化为全0
举个例子
#include
#include
int main()
{
int *p = calloc(10, sizeof(int));
if(NULL != p)
{
//使⽤空间
}
free(p);
p = NULL;
return 0;
}
所以如何我们对申请的内存空间的内容要求初始化,那么可以很⽅便的使⽤calloc函数来完成任
务
realloc:
void* realloc (void* ptr, size_t size);
————realloc函数可以让动态内存管理更加灵活
————ptr是要调整的内存地址
————size是调整之后的新地址
————返回值为调整之后的内存起始位置
————调整内存空间存在两种情况:
1:原有空间后有足够大空间:扩展内存直接在原有内存后追加空间,原空间数据不发生变化
2:原有空间后无足够大空间:在堆空间上另找一个合适大小的连续空间来使用,并将数据拷贝过来,同时释放旧空间
3: 返回指针可能指向新地址
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
区别如下:
一:
malloc不能初始化所分配的内存空间,而函数calloc能。
如果malloc函数分配的内存空间原来没有被使用过,则其中的每一位可能都是0;反之,如果这部分内存曾经被分配过,则其中可能遗留各种各样的数据,
也就是说,使用malloc函数的程序开始时(内存还没有被重新分配)能正常进行,但经过一段时间(内存已经被重新分配,可能会出现一些问题)。
二:
calloc会将所分配的空间中的每一位都初始化为零,
也就是说如果你是字符类型或整数类型的元素分配内存,那么这些元素将保证会被动的初始化为0,
如果你为指针类型的元素分配内存,那么这些元素通常会被初始化为空指针。
如果你为实型元素分配内存,则这些元素会被初始化为浮点型的0。
三:
realloc可以对给定的指针所指向的空间进行扩大或缩小,
无论是扩大还是缩小,原有的内存中的内容将保持不变,当然,对于缩小,则被缩小的那一部分的内容将会丢失,
realloc并不保持调整后的内存空间和原来的 内存空间保持同一内存地址,
realloc返回的指针很可能指向新的地址。