超出边界时,c字符串仍可正常工作?

时间:2013-03-02 16:47:21

标签: c arrays string printf

谁能告诉我为什么下面的代码仍然有效?很明显str [4]超出界限:

#include<stdio.h>
int main(){
    char str[3];
    scanf("%s", str);
    printf("%c\n", str[4]);
    printf("%s\n", str);
    return 0;
}

当它运行时,输入abcdefg,它将回显第5个字符串和整个字符串,没有 会是错的,很奇怪?

已经声明c / c ++不进行边界检查,而在上面的例子中, 我应该如何使用printf打印用户输入的c-string?或者更一般地说,如何正确使用来自用户的c-string?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

  

为什么会这样?

它“不起作用”。它可能似乎正在工作,;因为你的代码(访问数组越界)会调用未定义的行为,所以你可以得到任何结果。未定义的行为并不意味着“它必须崩溃”。

答案 2 :(得分:0)

您写道:

  

当它运行时,输入[abcdefg],它将回显第5个字符和整个字符   字符串,什么都不会错,很奇怪?

但我发现您发布的代码中没有输入读数:

#include<stdio.h>
int main(){
    char str[3];
    printf("%c\n", str[4]);
    printf("%s\n", str);
    return 0;
}

在任何情况下,str[4]都指向从char开始的第5个str(字节),因此它将打印恰好位于该内存位置的任何“垃圾”你的程序运行时。

超出范围访问数组项是 undefined 行为,因此未指定确切的行为。 请注意你的数组边界。