动态内存函数:malloc,calloc,realloc的介绍
Posted perseverance52
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态内存函数:malloc,calloc,realloc的介绍相关的知识,希望对你有一定的参考价值。
动态内存函数:malloc,calloc,realloc的介绍
malloc
这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。
- 类型:动态内存分配函数,被包含在malloc.h,stdlib.h
- 函数原型:void *malloc(unsigned int num_bytes),一个参数
- 功能:分配长度为num_bytes字节的内存块,申请的内存值不确定
- 返回值:如果分配成功则返回指向被分配起始地址的指针,否则返回空指针NULL。返回类型是void型,使用强制类型转换 int *p=(int *)malloc(sizeof(int))
- 注意:当内存不再使用时,应使用
free()
函数将内存块释放
1.如果开辟成功,则返回一个指向开辟好空间的指针。
2.如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
3.返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。
eg:开辟10个整形的空间 int* p = (int*)malloc(10*sizeof(int));
4.如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。
#include <stdio.h>
int main()
{
int* ptr = NULL;
ptr = (int*)malloc(4*sizeof(int));
if(NULL != ptr)//判断ptr指针是否为空
{
int i = 0;
for(i=0; i<4; i++)
{
*(ptr+i) = 0;
}
}
free(ptr);//释放ptr所指向的动态内存
//ptr = NULL;//
return 0;
}
calloc
int main()
{
int* p = calloc(10, sizeof(int));
if (p == NULL)
return 1;
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d\\n", *(p + i));
}
free(p);
p = NULL;
return 0;
}
realloc
realloc的函数的作用是对动态分配好的内存空间的大小进行调整。当我们一次性开辟的内存不够时,可以利用这个函数进行二次分配。
void* realloc (void* ptr, size_t size);
ptr 是要调整的内存地址
size 调整之后新大小
返回值为调整之后的内存起始位置。
这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到 新 的空间。
realloc在调整内存空间的是存在两种情况:
情况1:原有空间之后有足够大的空间
当是情况1 的时候,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化。
情况2:原有空间之后没有足够大的空间
当是情况2 的时候,原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小的连续空间来使用。这样函数返回的是一个新的内存地址
注意:
1.realloc函数必须是对malloc函数或者calloc函数申请的空间进行修改。
2.realloc有可能找不到合适的空间来调整大小,这时就返回 NULL
拓展:
realloc在单独使用的时候功能类似malloc
int main()
{
int* p = (int*)realloc(NULL, 40);//这里功能类似于malloc,就是直接在堆区开辟40个字节
return 0;
}
void test01(){
int* p1 = calloc(10,sizeof(int));
if (p1 == NULL){
return;
}
for (int i = 0; i < 10; i ++){
p1[i] = i + 1;
}
for (int i = 0; i < 10; i++){
printf("%d ",p1[i]);
}
printf("\\n");
free(p1);
}
void test02(){
int* p1 = calloc(10, sizeof(int));
if (p1 == NULL){
return;
}
for (int i = 0; i < 10; i++){
p1[i] = i + 1;
}
int* p2 = realloc(p1, 15 * sizeof(int));
if (p2 == NULL){
return;
}
printf("%d\\n", p1);
printf("%d\\n", p2);
//打印
for (int i = 0; i < 15; i++){
printf("%d ", p2[i]);
}
printf("\\n");
//重新赋值
for (int i = 0; i < 15; i++){
p2[i] = i + 1;
}
//再次打印
for (int i = 0; i < 15; i++){
printf("%d ", p2[i]);
}
printf("\\n");
free(p2);
}
切记:动态开辟的空间一定要释放,并且正确释放(释放多次、释放一部分等都是不正确的释放)
以上是关于动态内存函数:malloc,calloc,realloc的介绍的主要内容,如果未能解决你的问题,请参考以下文章
C语言中动态内存分配函数的用法及作用?(比如malloc,calloc,realloc等)
内存动态分配之realloc(),malloc(),calloc()与new运算符