0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

养成良好的编程习惯|堆内存初值不一定是0

学益得智能硬件 来源:学益得智能硬件 2024-12-18 09:14 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

什么是良好的编程习惯?可以看下这段代码,有没有什么问题?

#include 
#include 


int main()
{
char*s=(char*)malloc(1024);


    char ch;
    int i = 0;


    while ((ch = getchar()) != '
')
    {
        *(s + i++) = ch;
    }


    printf("%s
", s);


    return 0;
}

代码很简单,使用 malloc 申请一段堆内存,假设内存空间足够大。

通过 getchar 配合 while 循环,从标准输入获取一个字符串,直到遇到换行符结束。

最后就是把获取的字符串输出。

乍一看,好像程序没什么问题。

然后把程序运行起来,多测试几遍,也确实没发现问题。

但是如果把代码换个平台,比如放到了 Windows 上,使用 DEV C++ 编译器,再次运行,程序好像出了问题。

问题就出在了 malloc 函数上面。

malloc 用于申请堆内存,但是堆内存里面的内容是不确定的。

刚才我们用的两个编译器,gcc 默认把堆内存初始化成了 0,所以使用 getchar 获取多个字符后,最后是 �,是个标准的字符串。

而使用 dev C++,最后一个字符的后面并不是 �,输出也就出了问题。

良好的编程习惯就是使用内存的时候尽量初始化,如果代码这样写,不管移植到哪个平台,都不会出问题。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内存
    +关注

    关注

    9

    文章

    3234

    浏览量

    76512
  • 编程
    +关注

    关注

    90

    文章

    3723

    浏览量

    97435
  • 代码
    +关注

    关注

    30

    文章

    4976

    浏览量

    74378

原文标题:养成良好的编程习惯 | 堆内存初值不一定是0

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    你的路由器信号变弱可能只是因为SMA接口出现了氧化层

    信号变差不一定是固件或覆盖问题,很可能是被忽视的物理细节——SMA接口氧化。本文由德索连接器(Dosin)技术专家撰写,深入剖析趋肤效应对高频传输的影响,揭示阻抗失配导致信号损耗的底层逻辑。
    的头像 发表于 04-22 14:06 72次阅读
    你的路由器信号变弱可能只是因为SMA接口出现了氧化层

    面向视觉语言导航的任务驱动式地图学习框架MapDream介绍

    在视觉语言导航(VLN)中,地图长期作为独立模块构建,并通过固定接口交由导航策略使用。无论是BEV网格、拓扑图还是语义记忆模块,这些表示大多脱离策略学习而设计。结果是,机器人即使掌握场景的信息,也仍可能绕行甚至偏离目标,因为地图中编码的,并不一定是决定导航成功的关键信息。
    的头像 发表于 03-02 10:40 610次阅读
    面向视觉语言导航的任务驱动式地图学习框架MapDream介绍

    curl中的TFTP实现:整数下溢导致内存越界读取漏洞

    的条件:必须开启 TFTP no options 模式,并且需要服务器将块大小协商到个极小的值。 攻击难度高 :利用该漏洞读取到有价值信息(如密码、密钥等)的难度非常高。攻击者很难精确控制内存的布局
    发表于 02-19 13:55

    容易造成单片机内存溢出的几个陷阱介绍

    的函数递归调用的时候,大家尽量采用别的方式去代替。 区:当申请了动态区域,用完的时候一定要记得释放(free),如果没有释放,那么这块内存区域就将处于不可用状态(就像占着茅坑不拉屎
    发表于 01-23 07:25

    C语言嵌入式系统编程注意事项-内存操作

    启动后第条要执行的指令的位置。 记住:函数无它,唯指令集合耳;你可以调用个没有函数体的函数,本质上只是换个地址开始执行指令! 数组vs动态申请 在嵌入式系统中动态内存申请存在比
    发表于 01-04 07:31

    如何成为编程高手

    、多与别人交流   三人行必有我师,也许在次和别人不经意的谈话中,就可以迸出灵感的火花。多上上网,看看别人对同问题的看法,会给你很大的启发。   7、良好编程风格   注意
    发表于 12-29 06:57

    不同位数的CPU的变量所占的内存

    )上述表格适用于KEIL C51 和 KEIL MDK两个版本中,不一定适用于其它编辑器,具体内容,请查看KEIL软件手册。 2)CPU的位数不能决定int占几个字节,int是个关键字,只能本编译器
    发表于 12-09 07:30

    使用Keil MicroLIB时自动设置大小

    出错。 忍无可忍,决定分析下微库是怎么管理的。 首先打开项目编译后生成的链接地址映射文件Linker Address Map,我们这里是SmartOSF0_Debug.map 找到符号表段
    发表于 12-09 07:04

    深度睡眠时为什么串口会发送一堆 \\0

    RT,初始化串口,发送数据然后休眠,串口工具会收到CW32L010发送的一堆� ,AI统计了下 128个字节,是什么原因啊?
    发表于 11-28 07:25

    和栈的区别

    个由C/C 编译的程序占用的内存分为以下几个部分: 栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 区(heap):
    的头像 发表于 11-27 18:13 1232次阅读

    WebGL/Canvas 内存泄露分析

    的 JavaScript 对象未释放要复杂得多。个现代 WebGL/Canvas 应用的内存版图实际上跨越了三个截然不同但又相互关联的内存区域: 图 V8 引擎管理的 JavaScript
    的头像 发表于 10-21 11:40 540次阅读
    WebGL/Canvas <b class='flag-5'>内存</b>泄露分析

    串口DMA接收方式打开,为什么在开启IDLE中断的情况下还需要开启DMA中断呢?

    户接口rx_indicate来读取数据,此时,串口收到的数据并不一定是完整的帧,破坏了使用IDLE中断的意义。所以,为什么要开启DMA中断呢? 此处,可以看到不论是IDLE中断还是DMA传输中断,都会导致用户回调的调用。
    发表于 09-29 08:30

    水泥厂料机与取料机无线连锁控制解决方案实施案例

    在水泥厂的生产流程中,料机和取料机协同作业至关重要。某大型水泥厂的料区和取料区相隔一定距离,以往采用有线连接实现二者的连锁控制,但随着生产规模扩大和设备老化,问题频发。
    的头像 发表于 09-02 18:06 994次阅读
    水泥厂<b class='flag-5'>堆</b>料机与取料机无线连锁控制解决方案实施案例

    工业网关的内存有什么功能

    工业网关的内存是其核心硬件组件之,承担着保障设备高效、稳定运行的关键作用,具体功能可从以下几个方面详细说明: 、临时数据存储与处理 实时数据缓存:工业网关需要实时采集来自传感器、PLC(可
    的头像 发表于 08-15 10:15 688次阅读

    等等党不一定会赢,但小鹏G7一定会!

    行业资讯
    脑极体
    发布于 :2025年07月15日 15:50:41