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

嵌入式-C语言基础:malloc动态开辟内存空间的更多相关文章

  1. malloc分配的内存空间是连续的吗

    1.linux内核管理内存空间的分配,所有程序对内存空间的申请和其他操作,最终都会交给内核来管理. 2.linux实现的是“虚拟内存系统”,对用户而言,所有内存都是虚拟的,也就是说程序并不是直接运行在 ...

  2. C语言中计算变量占用内存空间

    C语言中计算变量占用内存空间 在C语言中通常用[sizeof]运算符计算变量占内存空间,如下面的例子:

  3. C语言基础 - 实现动态数组并增加内存管理

    用C语言实现一个动态数组,并对外暴露出对数组的增.删.改.查函数 (可以存储任意类型的元素并实现内存管理) 这里我的编译器就是xcode 分析: 模拟存放 一个 People类 有2个属性 字符串类型 ...

  4. c语言基础学习08_关于内存管理的复习

    =============================================================================对于c语言来讲,内存管理是一个很重要的内容,它 ...

  5. 嵌入式-C语言基础:联合体和共用体的概念

    有时候同一块内存空间存放类型不同,不同类型的变量共享一块空间. 结构体和共用体的区别: (1)结构体元素有各自单独空间,共用体元素共享空间,空间大小由最大类型确定. (2)结构体元素互不影响共用体赋值 ...

  6. 嵌入式-C语言基础:理解形参和实参的区别

    #include<stdio.h> //实参:函数原型中声明函数后面带的参数 int test(int x)//函数原型 { //函数体 printf("test里面的x地址=% ...

  7. C语言calloc()函数:分配内存空间并初始化——stm32中的应用

    经常在代码中看到使用malloc来分配,然后memset清零,其实calloc更加方便,一句顶两句~ 头文件:#include <stdlib.h> calloc() 函数用来动态地分配内 ...

  8. realloc ------ 扩大malloc得到的内存空间

    char* p = malloc(1024);char* q = realloc(p,2048); 现在的问题是我们应该如何处理指针 p. 刚开始按照我最直观的理解,如果就是直接将 p = NULL; ...

  9. 嵌入式-C语言基础:怎么样使得一个指针指向固定的区域?

    在学习单片机的时候,经常需要让一个指针指向固定的区域,这时候应该怎么操作? #include<stdio.h> int main() { int *p; int a =10; p=& ...

随机推荐

  1. 【Java】学习路径30-可变参数 Variable Parameter

    定义一个add函数,要求其功能:传入任意数量的参数然后返回相加的结果. public class VariableParameter { public static void main(String[ ...

  2. JavaScript设计模式及代码实现——单例模式

    单例模式 1 定义 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 2 应用时机 当一个类的实例被频繁使用,如果重复创建这个实例,会无端消耗资源.比如 dialog 弹窗会被全局重复使用 业务 ...

  3. ubuntu 安装及配置Apache

    一.下载.启动apache2 sudo apt-get install apache2 sudo /etc/init.d/apache2 restart 二.修改配置文件 1.更改网站根目录 sudo ...

  4. oracle数据泵导入导出数据

    expdp 导出 1.管理员用户登入sqlplus sqlplus system/manger@pdb1 2.创建逻辑导出目录 create directory dpdata as '/home/or ...

  5. 璞华PLM为全场景产品生命周期管理赋能,助力产品主线的企业数字化转型

    英文版的<产品生命周期管理(PLM)软件市场--增长.趋势.COVID-19影响和预测(2022 - 2027)>中对未来PLM市场概述的描述为:"产品生命周期管理(PLM)软件 ...

  6. 第四周(实际是n+周)

    1. tomcat启动报错 报错内容:ERROR RUNNING 'TOMCAT': UNABLE TO OPEN DEBUGGER PORT (127.0.0.1:38667): JAVA.NET. ...

  7. 【学习笔记】循环神经网络(RNN)

    前言 多方寻找视频于博客.学习笔记,依然不能完全熟悉RNN,因此决定还是回到书本(<神经网络与深度学习>第六章),一点点把啃下来,因为这一章对于整个NLP学习十分重要,我想打好基础. 当然 ...

  8. 微服务系列之Api文档 swagger整合

    1.前言 微服务架构随之而来的前后端彻底分离,且服务众多,无论是前后端对接亦或是产品.运营翻看,一个现代化.规范化.可视化.可尝试的文档是多么重要,所以我们这节就说说swagger. Swagger是 ...

  9. Elasticsearch:Elasticsearch-head - 用于浏览和与 Elasticsearch 集群进行交互的 Web 前端

    文章转载自:https://elasticstack.blog.csdn.net/article/details/114575256 离线安装方式:https://www.cnblogs.com/sa ...

  10. Elasticsearch:理解 mapping 中的 null_value

    转载自:https://elasticstack.blog.csdn.net/article/details/114266732 null 不能被索引或搜索. 当字段设置为 null(或空数组或 所有 ...