1. malloc()函数
void *malloc( size_t size );
(1)malloc函数是向内存申请一块连续可用的大小为size的内存空间并且返回指向这块空间的指针。
(2)若开辟成功,则返回指向开辟好的空间的指针。
(3)若开辟失败,则返回空指针NULL。
(4)返回值类型时void*,故malloc函数并不知道开辟空间的类型,具体类型在使用时由使用者决定。
(5)若参数size为0时,malloc函数的行为标准是未定义的,这取决于编译器。
(6)调用malloc函数后,需要对malloc函数的返回值做检查,以防开辟失败从而访问非法内存空间。
下面使用malloc函数:
#define _CRT_SECURE_NO_WARNINGS 1 #include<Windows.h> #include<stdio.h> int main() { int num = 3; int* ptr; ptr = (int*)malloc(sizeof(int)*num); if (ptr != NULL) { int i = 0; for (i = 0; i < num; i++) { ptr[i] = i; printf("%d ", ptr[i]); } } printf("\n"); system("pause"); return 0; }
此时,使用malloc函数动态申请了大小为num*sizeof(int)个字节的内存空间,返回指向所申请的内存空间的指针。但要注意,万一申请失败而在其后使用该内存就会使程序奔溃!所以一般对malloc函数的返回值要做检查,当返回值不是NULL时才使用。
2. free()函数
void free( void *memblock );
(1)free()函数作用是释放动态申请的内存空间。
(2)free()函数的参数表示动态申请内存的指针。
下面使用free()函数:
#define _CRT_SECURE_NO_WARNINGS 1 #include<Windows.h> #include<stdio.h> int main() { int num = 3; int* ptr; ptr = (int*)malloc(sizeof(int)*num); if (ptr != NULL) { int i = 0; for (i = 0; i < num; i++) { ptr[i] = i; printf("%d ", ptr[i]); } } printf("\n"); //调用free()函数 free(ptr); system("pause"); return 0; }
此时,调用free函数后释放了ptr所指向的动态申请的内存,但需要注意以下几点:
(1)内存在动态申请释放时必须整体申请,整体释放。
(2)内存申请一次,只能释放一次。
(3)一旦释放了动态申请的内存空间,则不能使用。
(4)基于free后不能使用,故建议在释放后将指针置为NULL。
3. calloc()函数
void *calloc( size_t num, size_t size );
其实,calloc函数和malloc函数的用法基本类似,均是用于动态申请内存空间。
(1)calloc函数的功能是开辟num个大小为size的内存空间,故共开辟了num*size个字节的内存空间。
(2)calloc函数与malloc函数的唯一区别就是calloc函数将开辟的空间的每个字节初始化为0。
下面使用calloc函数:
#define _CRT_SECURE_NO_WARNINGS 1 #include<Windows.h> #include<stdio.h> int main() { int num = 3; int* ptr1 = (int*)calloc(num,sizeof(int)); int* ptr2 = (int*)malloc(num*sizeof(int)); //打印calloc函数申请的内存的内容 if (ptr1 != NULL) { int i = 0; for (i = 0; i < num; i++) { printf("%d ", ptr1[i]); } } printf("\n"); //打印malloc函数申请的内存的内容 if (ptr2 != NULL) { int i = 0; for (i = 0; i < num; i++) { printf("%d ", ptr2[i]); } } printf("\n"); //调用free()函数 free(ptr1); free(ptr2); system("pause"); return 0; }
运行结果:
0 0 0 -842151451 -842151451 -842151451
故:calloc函数申请的内存存放的是0,而malloc函数申请的内存存放的是随机数!
4. realloc()函数
void *realloc( void *memblock, size_t size );
realloc函数的出现让动态内存更加地灵活,即使我们动态申请了内存,但发现有时候申请的内存太小了,有时候申请的内存太大了,这时候为了更加合理的使用内存,需要对 内存的大小作出一定调整。realloc函数就可以实现调整动态开辟的内存大小的操作。
(1)参数memblock是要调整的动态申请的内存的指针。
(2)参数size表示需要调整的大小。
(3)返回值为调整之后,指向动态申请的内存的指针。
(4)需要注意的是realloc函数在调整内存时存在以下两种情况:1.原有内存之后有足够空间可以向上扩展 2.原有内存之后没有足够的空间扩展,则需要在堆上重新开辟空间并将数据拷贝以及释放原有空间。故realloc函数返回值有可能和原来相同有可能不同。
下面使用realloc函数:
#define _CRT_SECURE_NO_WARNINGS 1 #include<Windows.h> #include<stdio.h> int main() { int num = 3; int* ptr1= (int*)malloc(num*sizeof(int)); //将动态申请的内存调小 int* ptr2 = realloc(ptr1, sizeof(int)); if (ptr2 != NULL) { ptr1 = ptr2; *ptr1 = 10; printf("%d\n", *ptr1); } printf("\n"); //使用完毕,释放动态申请的内存空间 free(ptr1); system("pause"); return 0; }
以上就是简单地介绍malloc函数、free函数、calloc函数、realloc函数的概念、使用方法以及使用时应注意的问题!