[问题] 字串输出疑问

楼主: x246libra (楓)   2017-11-03 15:59:05
开发平台(Platform): (Ex: Win10, Linux, ...)
xp
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
code block
问题(Question):
程式码交换位置后 执行出现错误
喂入的资料(Input):
1234
程式码(Code):(请善用置底文网页, 记得排版)
#include <stdio.h>
#include <stdlib.h>
main()
{
char str1[]="";
char *str2="您输入的字串如上";
printf("请输入字串:");
fgets(str1,80,stdin);
printf("%s",str1);
printf("%s",str2);
}
以上程式码 执行时 会出现错误
作者: MOONRAKER (㊣牛鹤鳗毛人)   2017-11-03 16:09:00
没有为什么,刚好而已。两段都是错的。
楼主: x246libra (楓)   2017-11-03 16:11:00
我是按照书本练习打的 执行出现错误的是书本范例我自己移到到下方才可以执行 但是不明白为什么为什么说两段都是错误的?
作者: stupid0319 (征女友)   2017-11-03 16:18:00
上面的那个如果输入超过4BYTE就溢位修改到str2指标了str2指标错误之后,printf("%s",str2);就挂掉了下面那个是str2指标在printf("%s",str1);后才补上运气好没挂点,但是两段code都是零分XD
作者: ssdoz2sk (眷恋着提拉米苏的风采~)   2017-11-03 16:25:00
烧书了(O
楼主: x246libra (楓)   2017-11-03 16:26:00
但是我只输入1234 没超过4BTYE 还是执行错误
作者: ssdoz2sk (眷恋着提拉米苏的风采~)   2017-11-03 16:27:00
\0
作者: stupid0319 (征女友)   2017-11-03 16:28:00
你确定是4BYTE? 还是5BYTE,还是6BYTE? 想清楚唷来4,5,6 BYTE选一个
楼主: x246libra (楓)   2017-11-03 16:33:00
加上 \0 应该是 5BYTE 吧
作者: stupid0319 (征女友)   2017-11-03 16:43:00
你strlen看看是不含\0几BYTE,别在玩内存溢位了,骇客级别的程式设计太难
楼主: x246libra (楓)   2017-11-03 16:53:00
用了strlen 输入1234 是得到5
作者: stupid0319 (征女友)   2017-11-03 16:56:00
5是包括\0还是不包括\0呢?或者是包括了什么特殊字符?
作者: loveflames (咕啾咕啾魔法阵)   2017-11-03 17:06:00
strlen是算str1那个字串的长度,要知道阵列不能作为函数参数,会decay成指标,然后没当的原因是你覆蓋的只是int看起来是32bit环境,那指标是4byte,超过对齐的范围就会覆蓋到后面的这些都是undefined行为,研究这么没营养的东西干嘛
作者: stupid0319 (征女友)   2017-11-03 17:28:00
太难了,str1因内存对齐的关系会配到4BYTE如果不是想当骇客的话,不要这样乱写程式
作者: loveflames (咕啾咕啾魔法阵)   2017-11-03 17:30:00
我对这个小有涉猎,虽然是很久以前的事
作者: stupid0319 (征女友)   2017-11-03 17:30:00
请写char str1[80] = "";而fgets会吃到\n,都要算进去,你都没处理,都没教?char str1[]="";同等于 char str1[1]; strl[0] = '\0'
作者: loveflames (咕啾咕啾魔法阵)   2017-11-03 17:36:00
str2在32bit环境是4byte,str1不到4byte,会对齐成4byte研究这个的原理也是浪费时间如果不是有心细究程式在内存的架构,就避开这种事
作者: stupid0319 (征女友)   2017-11-03 17:40:00
有些游戏机的破解就是利用游戏存盘名造成溢位用精心设计的档名字串把程式码导向别地方
楼主: x246libra (楓)   2017-11-03 17:42:00
我是想说 似乎人家都说C语言重视内存规划所以才想说多了解一点 这程式内存溢位是如何产生
作者: loveflames (咕啾咕啾魔法阵)   2017-11-03 17:45:00
这不是C的层次,而是OS了,如果对PE或ELF有兴趣再看
楼主: x246libra (楓)   2017-11-03 17:48:00
谢谢您的热心回答

Links booklink

Contact Us: admin [ a t ] ucptt.com