接上篇:char[str] crash原因分析

上篇我们提到,char[str]范围为5时,当我们输入字符超过5个,有时会crash ,有时不会,分析原因之前,我们先了解几个知识点:

1.首先,gets()函数是不安全的,因为它没有限制输入上限

2.其次,chat[str]是分配在栈上的,因为gets()可以无限读取,当读取超过char[str]的长度时,后面读取的字符内容会溢出,占用其他内存空间

3.然后,c跟c++里的函数在renturn或结束时,是会校验的

原因分析:

当char * str [5];下标为5的时候,可能输入100个字符没问题,输入101个字符就会crash,大概原因:

发现crash是因gets()所在的函数,return 的时候,会校验,假设main函数的指针是0xff0f,定义str的时候,内存是0xff00到0xff05,当内存溢出的时候,0xff05到0xff05之外的内存会被占用,当gets()所在的函数即main()的指针地址0xff0f被str的内容溢出占用时,main函数的return 0调用时,发现0xff0f里面的内容被修改,校验失败,crash掉

所以,结论是gets()读取字符串的时候,如果字符串的长度超过str定义的范围时,首先会溢出,当溢出占用了函数的指针所拥有的内存时,校验失败,程序crash ,所以这是一个编译无关的问题,但是平台相关的,因为在不同的平台上,比如windows和mac上或手机上,因为内存分配规则及管理方式可能不同,结果就不一样,比较明显的例子就是当str[5]时,mac上输入100位才会crash,windows上输入80位就会crash

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 多线程、特别是NSOperation 和 GCD 的内部原理。运行时机制的原理和运用场景。SDWebImage的原...
    LZM轮回阅读 2,046评论 0 12
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,412评论 0 6
  • ———————————————回答好下面的足够了---------------------------------...
    恒爱DE问候阅读 1,770评论 0 4
  • 史上最全的iOS面试题及答案 iOS面试小贴士———————————————回答好下面的足够了----------...
    Style_伟阅读 2,470评论 0 35
  • 画外音: 今天下了一天的雨,安静的呆在房间里,望着窗外。 世界,正悄悄地蒙上了一层面纱,生活撩开一角,日子真切在流逝。
    风之壹把刀阅读 202评论 3 7