嵌入式-C语言基础:malloc动态开辟内存空间
#include<stdio.h> #include<stdlib.h> int main() { // char *p;//定义一个野指针:没有让它指向一个变量的地址 // *p='c';//直接对野指针进行操作,会报错 char *p1; p1=malloc(1);//动态开辟内存 *p1='d'; printf("%c\n",*p1); return 0; }
malloc可以动态在堆上开辟地址,函数原型:void * malloc(size_t size);
strcpy,字符串的拷贝函数,函数原型:char * strcpy(char * dest,const char * src);
#include<stdio.h> #include<stdlib.h> #include <string.h> int main() { // char *p;//定义一个野指针:没有让它指向一个变量的地址 // *p='c';//直接对野指针进行操作,会报错 char *p1; p1=malloc(1);//动态开辟地址 *p1='d'; printf("%c\n",*p1); free(p1); //将字符串常数拷贝给字符串 char * p2; p2=(char *)malloc(12);//开辟12个字节的内存空间,并返回指针 strcpy(p2,"strcprtfkjk");//把字符串拷贝给p2 printf("%s\n",p2);//输出字符串 int len=strlen("strcprtfkjk12345664"); //计算新的长度,在原来的内存块上增加长度 int addlen=len-12+1;//+1是为了将'\0'加进来 printf("扩容前地址:%p\n",p2); realloc(p2,addlen); printf("扩容后地址:%p\n",p2); strcpy(p2,"strcprtfkjk12345664"); printf("打印字符串:"); puts(p2); printf("done\n"); free(p2); return 0; }
输出结果:
strcprtfkjk
扩容前地址:0000000000155CB0
扩容后地址:0000000000155CB0
打印字符串:strcprtfkjk12345664
done
注意:
malloc是在堆上开辟内存空间,数组是在栈上开辟空间,堆上的内存在函数结束后会释放,但是堆上的内存只有在程序退出的时候才会释放。
所以使用malloc开辟动态内存空间后一定要记得手动释放,否则将会造成堆内存泄露。
可以使用free函数来释放堆上的内存空间:
free函数原型:free(void * ptr);
realloc函数:realloc(void *ptr,size_t size);//重新调整malloc或者calloc函数分配的指针所指向的内存块的大小,size表示要增加的容量。
4556
分类:
嵌入式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
2021-11-01 C#使用内存和指针方式将字节数组转换为Bitmap