c字符串仍然工作时出界?
谁能告诉我为什么下面的代码仍然有效?很明显,在海峡[4]超出boundry的:c字符串仍然工作时出界?
#include<stdio.h>
int main(){
char str[3];
scanf("%s", str);
printf("%c\n", str[4]);
printf("%s\n", str);
return 0;
}
在运行时,输入abcdefg
,它将呼应第五焦炭,整个字符串,没有什么 将是错误的,不可思议?
已经声明c/C++没有进行边界检查,而在上面的情况下, 我该如何使用printf打印用户输入的c字符串?或者更一般地说,如何正确使用来自用户的C字符串?
str [4]给你一个指向你的字符串最后一个元素后的内存地址的指针。您仍然可以将其转换为角色,但您永远不知道自己会得到什么,并且您的软件可能会崩溃。
是的,已经声明c/C++没有进行边界检查,而在上面的例子中,我应该如何使用printf打印一个c字符串用户已进入?或者更一般地说,如何正确使用来自用户的C字符串? – comeonfox 2013-03-03 02:20:21
我认为scanf是一般的危险,因为它不会阻止缓冲区溢出,正如您在示例中所说明的那样。有关此主题的讨论,另见http://stackoverflow.com/questions/2430303/disadvantages-of-scanf。 – 2013-03-03 10:38:36
它为什么有效?
它不“工作”。它可能似乎正在工作,虽然;;因为你的代码(访问一个数组越界)调用未定义的行为,你可以从字面上得到任何结果。未定义的行为并不意味着“它必须崩溃”。
您写道:
在运行时,输入[ABCDEFG],它将呼应了第5焦炭,整个 字符串,什么都不会是错误的,不可思议?
,但我看不出有任何输入阅读您发布的代码:从str
开始
#include<stdio.h> int main(){ char str[3]; printf("%c\n", str[4]); printf("%s\n", str); return 0; }
在任何情况下,str[4]
点到5个char
(字节),所以它将在程序运行时打印恰好在该内存位置的任何“垃圾”。
访问数组项越界是undefined行为,所以没有指定确切的行为。 只要注意你的数组边界。
哦,我错误地删除了该行,现在它已被添加。另一个问题:我应该如何正确使用(如'printf(“%s”,str)')一个来自用户的c字符串? – comeonfox 2013-03-03 02:24:50
你运气不好 – 2013-03-02 16:49:16
因为它是'c' – Anirudha 2013-03-02 16:53:13