安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

C程序中与内存有关的常见错误

4月20日 吴梦筱投稿
  与内存有关的错误属于那种最令人惊恐的错误。在时间和空间上,经常在距离错误源一段距离之后才表现出来。将错误的数据写到错误的位置,你的程序可能在最终失败之前运行了一段时间。
  下面列举并分析与内存有关的几种错误:1、间接引用坏指针
  如果间接引用一个指向没有任何意义的数据的指针,那么操作系统会以段异常终止程序。如果向只读区域中写入数据,这些区域会以保护异常终止这个程序。
  一个常见的经典示例是scanf错误。这个函数用处是从标准输入读入一个整数到一个变量,正确的写法是传递给scanf一个格式串和变量的地址:scanf(d,value);
  然而,常见的书写错误如下:scanf(d,value);
  这种情况下,scanf将把value内容解释为一个地址,并试图将一个字写到这个位置。这会导致程序出现异常,有时会立即终止;有时会在相当长的时间后造成灾难性、令人困惑的后果。2、读未初始化的内存
  常见的错误是假设堆内存被初始化为零:intmatvec(intA,intx,intn){inti,j;inty(int)malloc(nsizeof(int));for(i0;i){for(j0;j){y〔i〕A〔i〕〔j〕x〔j〕}}}
  示例中不应该假设新申请的内存地址(y指向的地址)被初始化为零。正确的做法是显示地将y〔i〕设置为零,或者使用calloc申请内存。3、栈缓冲区溢出
  如果一个程序不检查输入字符串的大小就写入栈中目标缓冲区,那么这个程序就会出现缓冲区溢出的错误。如下程序:voidbuff(){charbuf〔64〕;gets(buf);}
  这个函数会出现缓冲区溢出错误,因为gets函数只是简单复制一个任意长度的字符串到缓冲区,不限制输入串的大小。解决这个问题的方法是,可以用限制了输入串大小的fgets函数。4、假设指针和它们指向的对象大小相同
  常见的错误是,假设指向对象的指针和它们所指向的对象是相同大小的,示例程序:intmakeArray(intn,intm){intA(int)malloc(nsizeof(int));注意此处语句,存在问题for(i0;i){A〔j〕(int)malloc(msizeof(int));}returnA;}
  此程序的目的是创建一个由n个指针组成的数组,每个指针都指向一个包含m个int的数组。然而,第4行程序代码将sizeof(int)写成了sizeof(int),代码实际上创建的是一个int的数组。
  这段代码只有在int和指向int的指针大小相同的机器上运行良好;否则,就会出现错误。5、内存越界
  这种错误会越界覆盖原有内存的数据,导致出错:intmakeArray(intn,intm){intA(int)malloc(nsizeof(int));注意此处语句,存在问题for(i0;i)注意循环终止条件{A〔j〕(int)malloc(msizeof(int));}returnA;}
  程序在第6行和第8行试图初始化这个数组的n1个元素,这个过程会覆盖A数组后面的某个内存位置。6、引用指针,而不是它所指向的对象
  如果不太注意C操作符的优先级和结合性,我们就会错误地操作指针,而不是指针所指向的对象。如果想要减少某个指针指向的整数的值,代码书写如下:
  然而,因为一元运算符和的优先级相同,且从右向左结合。那么上述代码实际的效果为(ptr),即减少的是指针自己的值,而不是它所指向的整数的值。
  如果对优先级和结合性有疑问的时候,就用括号。修正后的代码:(ptr);7、误解指针运算
  这类错误是忘记指针的算术运算操作是如何进行的。是以指针指向的对象的大小为单位进行的,而这种大小单位并不一定是字节。例如,扫描一个int的数组,并返回一个指向val首次出现的指针:intsearch(intp,intval){while(pp!val){psizeof(int);}}
  每次循环时,第5行都把指针加了4(一个整数的字节数),函数就不正确地扫描了数组中每4个整数。8、引用不存在的变量
  有的C程序员不太理解栈的规则,有时会引用不再合法的局部变量,如下所示:intstackref(){}
  这个函数返回一个指针(假设为ptr),指向栈里的一个局部变量,然后弹出它的栈帧。尽管ptr仍然指向一个合法的内存地址,但是它已经不再指向一个合法的变量了。
  以后在程序中调用其他函数时,内存将重用它们的栈帧。如果程序赋值给ptr,那么它可能实际上正在修改另一个含的栈帧中的数据。从而潜在地带来灾难性的后果。9、引用空闲堆块中的数据
  引用已经被释放了的堆块中的数据会导致出错。例如:intheapref(intn,intm){intx,y;x(int)malloc(nsizeof(int));申请内存。。。free(x);释放内存y(int)malloc(msizeof(int));for(i0;i){y〔i〕x〔i〕;}}
  当程序在第15行引用x〔i〕时,数组x可能已经是某个其他已分配堆块的一部分了,其内容也许被重写了。导致程序运行结果与预期不符合,出现错误。10、引起内存泄漏
  内存泄漏时缓慢、隐形的杀手,当程序员不小心忘记释放已分配的内存块,而在堆里创建了垃圾时,会发生这种问题。如下:voidleak(intn){intx(int)malloc(nsizeof(int));}
  如果经常调用这个函数,渐渐地,堆里会充满了垃圾,造成内存泄漏。有时会引起程序终止或其他问题。小结
  以上总结了C程序中,管理和使用内存常见的错误类型,并举例进行了说明。在实际的编程中,应该避免出现这些错误,否则会出现意想不到的后果。
  参考资料:《深入理解计算机系统》
投诉 评论 转载

大神魔改iPhone,充电口换成USBC,网友这才是真环保从去年发布iPhone12系列开始,苹果为了环保,不仅把包装盒的空间做小了,而且耳机和充电头都取消赠送了,对于所谓的环保策略,自然是遭到了不少网友的吐槽。有网友认为,苹果……iPhone13或配备屏下指纹iPadmini6概念图iPhone13或配备屏下指纹最近关于iPhone采用屏下指纹的消息是越来越多了,此前郭明錤也表示,2022年的iPhone至少有一款加入屏下指纹解锁功能。而近日,……没有四两铁,哪敢打大刀,这3款新能源车均是靠谱之选随着时代的变迁,汽车在大多数人眼里,已经不再是身份地位的象征,而是上下班的代步工具,接娃买菜的代步工具。大多数消费者也回归了理性,不愿再当新能源汽车的韭菜了,而是买自己需要的,……2021年30系高端游戏本推荐随着30系显卡的发售,30系笔记本逐渐占据高端游戏本市场,这一代的30系显卡笔记本比上一代20系产品更加值得购买,其中有几个优势:1、性能提高:30系笔记本显卡的表现功耗……广受争议,苹果推迟iOS15新功能果粉之家,专业苹果手机技术研究十年!您身边的苹果专家早在上个月出的时候,苹果就对外官宣,将在iOS15系统将通过Messages信息应用中敏感图像筛查、iCloud中儿童……国务院办公厅推动人工智能区块链车联网等领域数据采集标准化北京商报讯(记者刘四红)据中国政府网,1月6日,国务院办公厅关于印发要素市场化配置综合改革试点总体方案的通知,其中提到,拓展规范化数据开发利用场景。发挥领军企业和行业组织作用,……千元也有拍照好手机,1亿像素加持仅1399元,还有高刷屏和大在很多用户的印象中,两千元以下的手机中,就没有拍照好的手机,大部分喜欢拍照的用户,都会选择中高端机。事实上并如此,有一些千元机拍照也是十分给力,比不少中端机更好,比如Redmi……2022年空调业迎来拐点传统空调已成为过去唯有新风成行业共识【蓝科技观察】从价格战到价值战,从需要空调到需要健康空调,2022年的中国空调业或迎来拐点。随着人们生活水平的提高,仅有制冷制热功能的传统空调早已无法满足用户需求。行业内成达的……将iphone4塞进耳朵?告诉你AirPods的H1芯片有多AirPods第二代已经上市了,最重要的更新就是采用最新的H1芯片,当然还有支持Class1的蓝牙5。0芯片。还给AirPods带来了HeySiri的功能。据Twitte……对于中芯国际,对于梁孟松博士,终于可以放心了国产芯片应该怎么办?在设计上我们已经有了方向,也有了海思等领先的企业,但是在芯片的制造方面,存在严重的软肋,用任正非的话说我们可以设计出来先进的芯片,但是制造上遇到了问题。可以……笔记本独显丢失了怎么办?先检查驱动:右键win图标,设备管理器,显示适配器。驱动没问题问题可能就大了:如果独显消失或代码43就说明核心或显存坏了,拿去修吧。就目前形势维修成本较高(显卡涨价……C程序中与内存有关的常见错误与内存有关的错误属于那种最令人惊恐的错误。在时间和空间上,经常在距离错误源一段距离之后才表现出来。将错误的数据写到错误的位置,你的程序可能在最终失败之前运行了一段时间。下……
零跑T03小型新能源汽车首选,智能又安全侃财丨LV重新定义了无收入人群英特尔14nm工艺用了整整5代!手机CPU都已经来到7nm,特斯拉回应车主称刹车失灵加速到170驾驶员误踩下加速踏板腾讯旗下APP被传暂停更新,大厂新一轮监管风暴来袭?iOS15双卡双待,现已跌至1789元,从高端市场跌至低端市田轩大厂裁员,年轻人还能创新创业吗?i52410M处理器怎么样?东数西算带动互联网巨头绿色内卷!这些技术成风口随身WiFI是怎么用的?华为不当大哥后,为什么苹果能单枪匹马挑战所有的国产手机?ROG游戏手机5S系列国行版今晚亮相骁龙888Plus18G无人驾驶走向无人生还又一家明星公司烧光36亿关门小米成功密码:用新文化战略打造品牌感谢对手优秀作文范文胃的位置图(人的胃在身体的左边还是右边)吉克隽逸晒浴室自拍照引起热议,肌肉线条太明显,被指像男的有关于愧疚的作文范文腐烂的鱼能吃吗浇花用英语怎么说浇花的英语单词出境团队游恢复首日,有人进店咨询后当场下单筑梦情缘沈其东最后死了吗杜万鹰是什么结局日常穿搭还是半身裙实用又温柔,这四款百搭不挑人,咋穿都美人生格言座右铭36条

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利