-1

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

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

当它运行时, enter abcdefg,它会回显第 5 个字符和整个字符串,什么都不会出错,奇怪吗?

已经声明 c/c++ 不进行边界检查,而在上述情况下,我应该如何使用 printf 打印用户输入的 c 字符串?或更一般地说,如何正确使用来自用户的 c 字符串?

4

3 回答 3

2

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

于 2013-03-02T16:51:54.230 回答
1

为什么它有效?

它不“工作”。不过,它可能看起来有效;由于您的代码(越界访问数组)会调用未定义的行为,因此您实际上可以获得任何结果。未定义的行为并不意味着“它必须崩溃”。

于 2013-03-02T16:53:56.093 回答
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,因此它将打印程序运行时恰好位于该内存位置的任何“垃圾”。

越界访问数组项是未定义的行为,因此未指定确切的行为。只需注意您的数组边界。

于 2013-03-02T17:16:07.783 回答