嵌入式-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表示要增加的容量。

 

posted @   WellMandala  阅读(289)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
历史上的今天:
2021-11-01 C#使用内存和指针方式将字节数组转换为Bitmap
点击右上角即可分享
微信分享提示