什么是良好的编程习惯?可以看下这段代码,有没有什么问题?
#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浏览量
76508 -
编程
+关注
关注
90文章
3723浏览量
97434 -
代码
+关注
关注
30文章
4976浏览量
74375
原文标题:养成良好的编程习惯 | 堆内存初值不一定是0
文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
热点推荐
你的路由器信号变弱可能只是因为SMA接口出现了氧化层
信号变差不一定是固件或覆盖问题,很可能是被忽视的物理细节——SMA接口氧化。本文由德索连接器(Dosin)技术专家撰写,深入剖析趋肤效应对高频传输的影响,揭示阻抗失配导致信号损耗的底层逻辑。
面向视觉语言导航的任务驱动式地图学习框架MapDream介绍
在视觉语言导航(VLN)中,地图长期作为独立模块构建,并通过固定接口交由导航策略使用。无论是BEV网格、拓扑图还是语义记忆模块,这些表示大多脱离策略学习而设计。结果是,机器人即使掌握场景的信息,也仍可能绕行甚至偏离目标,因为地图中编码的,并不一定是决定导航成功的关键信息。
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
堆和栈的区别
一个由C/C 编译的程序占用的内存分为以下几个部分:
栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆区(heap):一
WebGL/Canvas 内存泄露分析
的 JavaScript 对象未释放要复杂得多。一个现代 WebGL/Canvas 应用的内存版图实际上跨越了三个截然不同但又相互关联的内存区域: 图 V8 引擎管理的 JavaScript
串口DMA接收方式打开,为什么在开启IDLE中断的情况下还需要开启DMA中断呢?
户接口rx_indicate来读取数据,此时,串口收到的数据并不一定是完整的一帧,破坏了使用IDLE中断的意义。所以,为什么要开启DMA中断呢?
此处,可以看到不论是IDLE中断还是DMA传输中断,都会导致用户回调的调用。
发表于 09-29 08:30
水泥厂堆料机与取料机无线连锁控制解决方案实施案例
在水泥厂的生产流程中,堆料机和取料机协同作业至关重要。某大型水泥厂的堆料区和取料区相隔一定距离,以往采用有线连接实现二者的连锁控制,但随着生产规模扩大和设备老化,问题频发。
工业网关的内存有什么功能
工业网关的内存是其核心硬件组件之一,承担着保障设备高效、稳定运行的关键作用,具体功能可从以下几个方面详细说明: 一、临时数据存储与处理 实时数据缓存:工业网关需要实时采集来自传感器、PLC(可
养成良好的编程习惯|堆内存初值不一定是0
评论