C语言中关于数组的问题。
voidmain(){charc[4];scanf("%s",c);printf("%s\n",c);}我输入china,为什么程序仍能正常运行,输出china呢,我定义...
void main()
{ char c[4];
scanf("%s",c);
printf("%s\n",c);
}
我输入china,为什么程序仍能正常运行,输出china呢,我定义的数组长度只有4啊。 展开
{ char c[4];
scanf("%s",c);
printf("%s\n",c);
}
我输入china,为什么程序仍能正常运行,输出china呢,我定义的数组长度只有4啊。 展开
7个回答
展开全部
>>这就是为什么现在很多软件存在 缓冲区溢出漏洞的 原因了。
>>scanf(\"%s\",c); 会覆盖c数组后面的内存,而printf(\"%s\\n\",c);
>>又是非遇到\'\\0\' 才停止打印
scanf("%s",c);可以造成缓冲区漏洞,但是那和楼主的情况是不同的.楼主的程序覆盖的是变量存储空间的内
存.而不是缓冲区的内存,除非他覆盖的地址空间大得可怕,否则是不会覆盖到堆栈地址造成溢出的.
楼主的情况是一种非法操作.由于%s不检查数组是否越界,该程序在输入的时候,占用了紧邻char c[4]的内存.
另外,c语言并没有规定越界检查的位置,所以检查要靠自己.
应该花时间看一下c89/c90,c99
>>我也出现过这种问题,很正常,
正常的.
>>这是软件的问题,一般你再重装一个就行
不是软件问题.有可能编译器考虑到了这些问题(%s不检查数组越界),在编译的时候给出一定的提示.
但是程序中接受超过数组长度字符串的原因是 %s 不检查数组越界.
另外,我们写出来的程序应该是编译器无关的,不应该依靠编译器.
因为编译器并没有统一的标准.而只对c语言进行了一定的标准化.编译器都应该可以编译这些标准c.
>>scanf(\"%s\",c); 会覆盖c数组后面的内存,而printf(\"%s\\n\",c);
>>又是非遇到\'\\0\' 才停止打印
scanf("%s",c);可以造成缓冲区漏洞,但是那和楼主的情况是不同的.楼主的程序覆盖的是变量存储空间的内
存.而不是缓冲区的内存,除非他覆盖的地址空间大得可怕,否则是不会覆盖到堆栈地址造成溢出的.
楼主的情况是一种非法操作.由于%s不检查数组是否越界,该程序在输入的时候,占用了紧邻char c[4]的内存.
另外,c语言并没有规定越界检查的位置,所以检查要靠自己.
应该花时间看一下c89/c90,c99
>>我也出现过这种问题,很正常,
正常的.
>>这是软件的问题,一般你再重装一个就行
不是软件问题.有可能编译器考虑到了这些问题(%s不检查数组越界),在编译的时候给出一定的提示.
但是程序中接受超过数组长度字符串的原因是 %s 不检查数组越界.
另外,我们写出来的程序应该是编译器无关的,不应该依靠编译器.
因为编译器并没有统一的标准.而只对c语言进行了一定的标准化.编译器都应该可以编译这些标准c.
展开全部
如上所说。。这确实是编译器问题。它不报错。
如要使编辑器显示的结果加以字符个数限制。我们可以在这行语句中加以限制说明:scanf("%4s",c);里面的4就是限制的个数。这样输入的字符只把4个字符存入数组中。所以只显示出4个字符。
如要使编辑器显示的结果加以字符个数限制。我们可以在这行语句中加以限制说明:scanf("%4s",c);里面的4就是限制的个数。这样输入的字符只把4个字符存入数组中。所以只显示出4个字符。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这就是为什么现在很多软件存在 缓冲区溢出漏洞的 原因了。
scanf(\"%s\",c); 会覆盖c数组后面的内存,而printf(\"%s\\n\",c);
又是非遇到\'\\0\' 才停止打印
scanf(\"%s\",c); 会覆盖c数组后面的内存,而printf(\"%s\\n\",c);
又是非遇到\'\\0\' 才停止打印
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
windows下tc等编译器确实如此, 就是widebright 同志解释.
vc等在默认设置下会报运行错!在输出之后,
标准C下其他平台与编译器也有关系,如scounix7在运行会前报错.......
vc等在默认设置下会报运行错!在输出之后,
标准C下其他平台与编译器也有关系,如scounix7在运行会前报错.......
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我也出现过这种问题,很正常,这是软件的问题,一般你再重装一个就行
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询