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字符串?

+1

你运气不好 – 2013-03-02 16:49:16

+1

因为它是'c' – Anirudha 2013-03-02 16:53:13

str [4]给你一个指向你的字符串最后一个元素后的内存地址的指针。您仍然可以将其转换为角色,但您永远不知道自己会得到什么,并且您的软件可能会崩溃。

+0

是的,已经声明c/C++没有进行边界检查,而在上面的例子中,我应该如何使用printf打印一个c字符串用户已进入?或者更一般地说,如何正确使用来自用户的C字符串? – comeonfox 2013-03-03 02:20:21

+0

我认为scanf是一般的危险,因为它不会阻止缓冲区溢出,正如您在示例中所说明的那样。有关此主题的讨论,另见http://*.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行为,所以没有指定确切的行为。 只要注意你的数组边界。

+0

哦,我错误地删除了该行,现在它已被添加。另一个问题:我应该如何正确使用(如'printf(“%s”,str)')一个来自用户的c字符串? – comeonfox 2013-03-03 02:24:50