嵌入式-C语言基础:malloc动态开辟内存空间
2024-08-29 04:40:30
#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表示要增加的容量。
最新文章
- Socket--Android王国的外交发言人
- 使用Android Butterknife
- Web方式预览Office/Word/Excel/pdf文件解决方案
- [R]R的工作流
- j2ee分布式缓存同步实现方案dlcache v1.0.0
- Makefile中指示符“include”、“-include”和“sinclude”的区别
- mysql中不同事务隔离级别下数据的显示效果--转载
- ubuntu下使用脚本交叉编译windows下使用的ffmpeg + X264
- Gesture(手势)浅析
- 2014华为机试西安地区B组试题
- WebView无法放大缩小解决方式
- linux文件系统详解
- Vagrant下共享目录下静态文件(js/jpg/png等)修改完运行报错
- 重载equals方法时要遵守的通用约定--自反性,对称性,传递性,一致性,非空性
- 深入Java虚拟机(2)——Java的平台无关性
- phpstudy运行时出现没有安装VC库
- SQL SERVER LINUX
- Android设置shape后改变颜色
- HTML&;javaSkcript&;CSS&;jQuery&;ajax-XSS
- install ceph by ceph-deploy