嵌入式-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