赞
踩
本篇文章介绍c语言中实现动态内存管理的库函数,比如malloc()、free()、calloc()、realloc()
在一般情况下,通过以下方式开辟内存空间
int var = 20; //在栈空间开辟4个字节的
char str[10] = {0}; //在栈空间开辟10个字节连续的空间
上面开辟空间的方式有两个特点:
- 开辟空间的大小是固定的,不可变的
- 在栈中开辟,并且在编译时分配空间
当需要在程序运行过程中才能知道所有空间的大小时,这时候就需要动态内存分配。
动态内存分配是指在程序运行过程中,可以动态地向操作系统申请内存空间。
在c语言中,可以借助malloc()、free()、calloc()、realloc()这几个库函数实现动态内存的管理。
下面是cplusplus网站关于malloc()函数的介绍,如下:
作用:申请size个字节内存空间
说明:
返回值说明:
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<errno.h> int main() { //申请40个字节 int* p = (int*)malloc(40); //判断申请是否成功 if (NULL == p) { printf("%s", strerror(errno)); return 1; } //使用空间 int i = 0; int sz = 40 / sizeof(int); for (i = 0; i < sz; i++) { *(p + i) = i; } //打印 for (i = 0; i < sz; i++) { printf("%d ", *(p + i)); } //使用完之后,释放空间 free(p); p = NULL; return 0; }
下面是cplusplus网站关于free()函数的介绍,如下:
作用:释放通过malloc()、calloc()、realloc()函数申请的空间
说明:
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<errno.h> int main() { //申请40个字节 int* p = (int*)malloc(40); //判断申请是否成功 if (NULL == p) { printf("%s", strerror(errno)); return 1; } //使用空间 int i = 0; int sz = 40 / sizeof(int); for (i = 0; i < sz; i++) { *(p + i) = i; } //使用完之后,释放空间 free(p); p = NULL; return 0; }
通过vs的内存监视查看(未释放前)
利用free()释放p指向的空间后
通过结果得出,free(p)
释放p指向的空间后,p的指向没有改变,为了避免越界访问,因此可以将p = NULL
下面是cplusplus网站关于calloc()函数的介绍,如下:
作用:申请一块num个size字节大小的连续空间。
说明:
申请10个int大小的空间(10*sizeof(int)个字节)
#include<stdio.h> #include<stdlib.h> #include<errno.h> #include<string.h> //申请10个int的空间 int main() { int* p = (int*)calloc(10, sizeof(int)); if (NULL == p) { printf("%s\n", strerror(errno)); return 1; } //释放空间 free(p); p = NULL; return 0; }
通过vs的内存监视查看
calloc()申请成功后,将每个字节初始化为了0,也可利用malloc()+memset()实现。
下面是cplusplus网站关于realloc()函数的介绍,如下:
作用:将ptr指向的内存块的大小改变为size个字节大小
说明:
在ptr指向的内存块后面直接扩容
开辟一块大小为size的新空间
在这种情况下,在扩容成功后,会将原始内存的内容拷贝到扩容内存中,然后释放原始内存。
#include<stdio.h> #include<stdlib.h> #include<errno.h> #include<string.h> int main() { //申请10个int的空间 int* p = (int*)malloc(10*sizeof(int)); if (NULL == p) { printf("%s\n", strerror(errno)); return 1; } memset(p, 0, 40); //扩容将p指向的内存块扩容到80个字节 int* pp = (int*)realloc(p, 80); if (pp != NULL) { p = pp; pp = NULL; } //释放p free(p); p = NULL; return 0; }
通过vs的内存监视查看内存情况
p和pp指向的空间不相同,说明此次扩容是在新的内存上开辟;同时,pp的前40个字节的内容和p的40个字节的内容是相同的,说明新扩容的内存将原始内存的内容进行了拷贝。
本篇文章介绍了在c语言中实现动态内存管理的四个库函数,malloc()、free()、calloc()、realloc()。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。