动态内存申请库函数:malloc,calloc,realloc

  我们经常会使用C语言中的库函数会在堆上进行动态内存的申请,至于malloc,calloc,realloc这三个库函数有什么共同点和异同点,今天就来仔细聊聊。

共同点:

  • 都是C语言中用来在堆上申请动态内存空间的库函数,当然了,在C++中依旧可以正常使用。
  • 如果申请空间成功,返回空间首地址,如果失败则返回NULL。在使用时,申请之后一定要记得判断是否申请成功。
  • 返回值类型是 void*,接收返回值的时候,需要进行强制类型转换。
  • 空间用完之后,一定要手动free来释放内存。

不同点:

malloc:

void* malloc (size_t size);
char* buffer = (char*) malloc (10);

if (buffer==NULL) return 0;

free (buffer);
  • 分配连续内存块
  • 分配一块内存大小为size字节的块,并返回一个指向该块开头的指针。将其强制转换为所需的数据指针类型,以便对其解引用。
  • 新分配的内存块的内容未初始化,值不确定
  • 如果size为零,则返回值取决于特定的库实现(它可以是空指针,也可以不是空指针),但是不得对返回的指针进行解引用。
  • 参数:申请的空间所占总的字节数
  • 可使用空间大小受用户申请大小限制
  • malloc在分配内存的时候会保留一定的空间用来记录分配情况,分配的次数越多,这些记录占用的空间就越多。另外,根据malloc实现策略的不同,malloc每次在分配的时候,可能分配的空间比实际要求的多一些,多次分配会导致更多的这种浪费,所以我们要尽量避免多次分配小空间,尽量一次性分配大空间。

calloc:

void* calloc(size_t num,size_t size);
int* pData = (int*) calloc (10,sizeof(int));

if (buffer==NULL) return 0;

free (pData);
  • 分配内存块
  • 如果size为零,则返回值取决于特定的库实现(它可以是空指针,也可以不是空指针),但是不得对返回的指针进行解引用。
  • num:要分配的元素数,size:每个元素的大小(字节长)。
  • 分配了一个初始化为0的 num*size 字节存储块。
  • 可使用空间大小受用户申请大小限制

realloc:

void* realloc (void* ptr, size_t size);
int* numbers = NULL;
int* more_numbers = (int*) realloc (numbers, 10 * sizeof(int));
  • 更改ptr指向的内存块的大小,将其调整到size字节。
  • 返回值是指向重新分配的存储块的指针,该指针可以与ptr相同,也可以是新位置。
  • 判断ptr指向的空间是否在堆上,不在则程序运行错误。
  • 如果ptr是空指针,则该函数的行为类似于malloc,分配一个新的大小为size的块,并返回一个指向其开头的指针。申请失败返回NULL。
  • 如果新大小等于原来大小,什么都不干。如果新大小比原来小,则会有数据丢失。如果新大小比原来大,大一点,则在原空间后面继续申请,如果够,依旧返回原空间首地址,如果新空间比原来大得多,原空间后面不够,则重新申请一块size的新空间,将原空间内容浅拷贝过去,释放旧空间,返回新空间地址。申请失败返回NULL。
  • 如果函数未能分配所请求的内存块,则返回空指针,并且不会释放由参数ptr指向的内存块(它仍然有效,并且其内容不变)。
  • 如果返回值为NULL,要么是因为空间分配失败,要么是因为size是零。
  • C++98:如果size为零,则先前在ptr处分配的内存将被释放,释放完成后,返回空指针。
  • C++11: 如果size为零,则返回值取决于特定的库实现(它可以是空指针,也可以不是空指针),但是不得对返回的指针进行解引用。

总结:
1.初始化区别和参数区别
  malloc函数不能初始化所分配的内存空间,calloc函数会将所分配的内存空间都初始化为零。请求数量的方式不同,calloc的参数包括所需元素的数量和每个元素的字节,根据这些值可以计算出总共需要分配的内存空间。
2.功能上的区别
  malloc与calloc用来动态分配内存空间,而realloc则是对给定的指针所指向的内存空间进行扩大或者缩小。

越努力,越幸福!

原创文章 13 获赞 31 访问量 1249

猜你喜欢

转载自blog.csdn.net/chenzhanpeng_/article/details/105995145