C语言关于gets函数输入串长度问题!
1.st[5]的大小是5个字节,为什么输入8个数字不会崩溃,而输入9个数字就崩溃。2.为什么puts还能正常的输出st[5]?3.为什么printf里面没有报数组越界错误...
1.st[5]的大小是5个字节,为什么输入8个数字不会崩溃,而输入9个数字就崩溃。2.为什么puts还能正常的输出st[5]?3.为什么printf里面没有报数组越界错误?4.为什么for循环只输出了4个数字?求高手帮忙分析分析gets函数和puts!谢谢啦!!财富值不是问题!一切为了知识!
展开
展开全部
让人分析代码,至少要把代码贴出来运行啊,总不可能抄写你的代码吧!
gets和scanf()的区别就是前者接收空格、制表符Tab和回车等,遇见EOF停止!而后者遇见空格、制表符Tab和回车等就停止;
数组只能存1234\0;后面的56789都是越界的;为什么到8没有关系,而是9崩溃是因为你运气好,空闲内存还有;第9个刚好访问了其他程序的内存!
而为什么puts和printf可以打印到8是因为再8后面才遇到'\0';
为什么for只输出4个数;是因为你用的32位编译器,所以sizeof(st)==4;如果你用64的编译器,那么sizeof(st)==8;因为指针大小再32是4个字节,64位8个字节!
好了,老板的4个问题都帮你分析了!给财富值200;
gets和scanf()的区别就是前者接收空格、制表符Tab和回车等,遇见EOF停止!而后者遇见空格、制表符Tab和回车等就停止;
数组只能存1234\0;后面的56789都是越界的;为什么到8没有关系,而是9崩溃是因为你运气好,空闲内存还有;第9个刚好访问了其他程序的内存!
而为什么puts和printf可以打印到8是因为再8后面才遇到'\0';
为什么for只输出4个数;是因为你用的32位编译器,所以sizeof(st)==4;如果你用64的编译器,那么sizeof(st)==8;因为指针大小再32是4个字节,64位8个字节!
好了,老板的4个问题都帮你分析了!给财富值200;
展开全部
char[5]是你开辟了五个字节的空间 sizeof(st)就是 5啊 所以就会有四个
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
gets()是C语言里一个非常危险的函数,主要原因是如果输入的字符串过长,会导致缓冲区溢出,也就是说多余的字符超出了指定的目标空间,如果这些多余的字符只是占用了尚未使用的内存,就不会立即出现问题,如果他们擦写掉了程序中的其他数据,会导致程序异常中止,就像你的截图一样,Unix系统更是会直接提示你“Segmentation fault”即分段错误,表示程序试图访问未被分配的内存。C99标准中的fgets()函数和C11标准中可选扩展函数gets_s()均可以防止这种事情的发生。总的来说,系统信任程序员而不信任用户。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询