C语言malloc()、calloc()和realloc()的用法(附带实例)
内存的全局存储空间中,程序可动态分配和释放的内存块称为自由存储空间,也称为堆。
C程序中,可以用 malloc()、calloc() 和 realloc() 函数来从堆中动态地分配内存。
malloc() 函数成功分配内存空间后会返回一个指针,因为分配的是一个 int 型空间,所以返回指针时也应该使用对应的 int 型指针,这样就要进行强制类型转换。最后将函数返回的指针赋值给指针 pInt,就可以保存动态分配的整型空间地址了。
【实例】某明星的演唱会,会馆可以容纳一万人。申请内存,存储人数信息,并将人数输出。
运行程序,结果为:
例如,使用 calloc() 函数分配一个整型数组内存空间:
【实例】动态分配一个指针。使用 strcpy() 函数为字符数组赋值,再进行输出,以验证分配的内存是否正确保存了数据。具体代码如下:
例如,将分配的实型空间大小改为整型大小,代码如下:
【实例】定义了一个整型指针和实型指针,利用 realloc() 函数重新分配内存,具体代码如下:
C程序中,可以用 malloc()、calloc() 和 realloc() 函数来从堆中动态地分配内存。
C语言malloc()函数
使用 malloc() 函数,要包含 <stdlib.h> 头文件。malloc() 函数的功能是在内存中动态地分配一块 size 大小的内存空间。其原型如下:void *malloc(unsigned int size);malloc() 函数会返回一个指针,指向分配的内存空间。如果分配出现错误,则返回 NULL。
例如,使用 malloc() 函数分配一个整型内存空间:注意,使用 malloc() 函数分配的内存空间位于堆中,而不是栈中。因此,在使用完这块内存之后,一定要将其释放掉,释放内存空间使用的是 free() 函数。
int *plnt; /* 定义指针 */ plnt = (int*)malloc(sizeof(int)); /* 指针指向分配的 int 型空间 */首先定义指针 pInt,用来保存分配的内存地址。在使用 malloc() 函数分配内存空间时,需要指定内存空间的大小(size),这里调用 sizeof() 函数就可以得到指定类型的大小。
malloc() 函数成功分配内存空间后会返回一个指针,因为分配的是一个 int 型空间,所以返回指针时也应该使用对应的 int 型指针,这样就要进行强制类型转换。最后将函数返回的指针赋值给指针 pInt,就可以保存动态分配的整型空间地址了。
【实例】某明星的演唱会,会馆可以容纳一万人。申请内存,存储人数信息,并将人数输出。
#include <stdlib.h> #include <stdio.h> int main() { int* iIntMalloc; iIntMalloc = (int*)malloc(sizeof(int)); /* 分配一个整型内存空间 */ *iIntMalloc = 10000; /* 使用该空间保存人数信息 */ printf("现场有%d人\n", *iIntMalloc); /* 输出数据 */ free(iIntMalloc); return 0; }程序中首先使用 malloc() 函数分配了一个 int 型内存空间,用指针 iIntMalloc 指向它,然后使用该空间保存演唱会人数信息,最后显示该数据。
运行程序,结果为:
现场有10000
C语言calloc()函数
使用 calloc() 函数,也要包含头文件<stdlib.h>。calloc() 函数的功能是在内存中动态分配 n 个长度为 size 的连续内存空间。其原型如下:void * calloc(unsigned n, unsigned size);calloc() 函数会返回一个指针,该指针指向动态分配的连续内存空间的首地址。当空间分配错误时,返回 NULL。
例如,使用 calloc() 函数分配一个整型数组内存空间:
int* pArray; /* 定义指针 */ pArray = (int*)calloc(3, sizeof(int)); /* 指针指向分配的数组内存 */上面的代码中,pArray 为一个整型指针,使用 calloc() 函数分配 3 个整型内存空间给一个数组,3 表示分配数组中元素的个数,int 表示元素的类型。最后将返回的指针赋予 pArray 指针变量,pArray 指向的就是该数组的首地址。
【实例】动态分配一个指针。使用 strcpy() 函数为字符数组赋值,再进行输出,以验证分配的内存是否正确保存了数据。具体代码如下:
#include <stdlib.h> /* 包含头文件 */ #include <stdio.h> #include <string.h> int main() { char* ch; /* 定义指针 */ ch = (char*)calloc(30, sizeof(char)); /* 分配一段字符数组内存 */ strcpy(ch, "C语言中文网"); /* 复制字符串 */ printf("%s\n", ch); /* 输出字符串 */ free(ch); /* 释放空间 */ return 0; /* 程序结束 */ }运行程序,结果为:
C语言中文网
C语言realloc()函数
使用 realloc() 函数前,要先包含头文件 <stdlib.h>。realloc() 函数的功能是将 ptr 指针指向的内存空间大小改为 size。其原型如下:void *realloc(void *ptr, size_t size);size 表示新分配的内存空间的大小,其值可以是任意的,既可以比原来的数值大,也可以比原来的数值小。返回值是一个指向新地址的指针,如果出现错误,则返回 NULL。
例如,将分配的实型空间大小改为整型大小,代码如下:
fDouble = (double*)malloc(sizeof(double)); /* 定义实型指针,分配一个实型空间 */ iInt = realloc(fDouble, sizeof(int)); /* 定义整型指针,将实型空间改为整形空间 */其中,fDouble 指向分配的实型空间,之后使用 realloc() 函数改变 fDouble 指向的空间大小,将其大小设置为整型,然后将改变后的内存空间地址返回,赋值给 iInt 整型指针。
【实例】定义了一个整型指针和实型指针,利用 realloc() 函数重新分配内存,具体代码如下:
#include <stdio.h> #include <stdlib.h> int main() { int *iInt; /* 定义整型指针 */ char* cChar; /* 定义字符型指针 */ iInt = (int*)malloc(sizeof(int)); /* 使用 malloc 分配整型空间 */ printf("整型数据内存是:%d\n", sizeof(*iInt)); /* 输出空间的大小 */ cChar = realloc(fDouble, sizeof(char)); /* 使用 realloc 改变分配的空间大小 */ printf("字符数据内存是:%d\n", sizeof(*cChar)); /* 输出空间的大小 */ free(cChar); return 0; /* 程序结束 */ }运行程序,结果为:
整型数据内存是:4
字符数据内存是:1
总结
函数 malloc()、calloc() 和 realloc() 都可以动态分配空间,它们之间的区别在于:- malloc() 函数分配一块内存空间,且不进行初始化;
- calloc() 函数分配连续多块大小相同的内存空间,且会将其初始化为零;
- realloc() 函数主要用于调整内存空间的大小。