malloc()函数
1、malloc()函数
malloc()函数的头文件是stdlib.h,其函数声明如下:
void* malloc(size_t size);
其中参数size_t size表示动态内存分配空间的大小,以字节为单位。
size_t 是typedef重定义的类型,重定义这样数据类型的作用就是让使用者一目了然,指示使用者这个参数表示一个长度,在 size后加上t,表示是整型相关数据类型的,以后看到xxx_t的类型,通常都是整型相关数据类型重定义。
在这里malloc()函数的返回值是一个指针,或者说是分配后内存空间的首地址
如果malloc()函数申请空间成功则返回一段内存空间的首地址,失败则返回NULL
2、int *p;
p = malloc(sizeof(int));
在这里是不能这样写的,会出现错误:从类型 'void*' 到类型‘int’的转换无效,应该改为:
p =(int *) malloc(sizeof(int));
3、memset()函数
在使用malloc()函数申请的空间之前,最好用memset()函数把这段内存空间清理一下,因为用malloc()函数申请的空间仅仅保 证的是内存空间的大小,并不保证内存空间是否有数据垃圾
4、释放内存空间
当不在使用malloc()函数申请的空间之后,应该使用如下函数释放掉这个内存空间:
void free(void *ptr);
其中void *ptr是malloc()函数的返回值,也就是内存空间的首地址
如果只知道使用,而不知道释放,则在7天*24小时运行的嵌入式产品中,很容易会出现内存泄漏,最终导致系统瘫痪
5、栗子
#include <iostream> #include <cstdlib> #include <cstring> using namespace std; int main() { char* p;//(1)定义一个char*型指针变量p p = (char*)malloc(10 * sizeof(char));//(2)为p分配10个字节的内存空间 memset(p, 0, 10 * sizeof(char)); strcpy_s(p, 10, "come on");//(3)复制"come on" 字符串到p指向的内存空间 cout << "p: " << p << endl; p = (char*)realloc(p, 20 * sizeof(char));//(4)将p指针指向的内存空间再扩大20个字节 cout << "p: " << sizeof(p) << endl; strcat_s(p, 20, ",baby!");//(5)将",baby!"字符复制在p指向空间字符串的后面 cout << "p: " << p << endl; free(p);//(6)释放p指向的空间 return 0; }
输出:
p: come on
p: 4
p: come on,baby!
sizeof不能计算动态分配空间的大小,不管怎么给p分配内存,输出都为4
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了