谁能告诉我为什么下面的代码仍然有效?很明显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?
答案 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 行为,因此未指定确切的行为。 请注意你的数组边界。