上篇我们提到,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
网友评论