考虑一下该计划
#include<stdio.h>
int main()
{
char a[] = "hello";
printf("%c", *(a + 5));
printf("%c", *(a + 6));
printf("%c", *(a + 99));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里第一个printf是打印NULL还是垃圾值?最后两个printf怎么样?
我很困惑因为我在数组绑定之外访问.
当你创建这样的字符数组
char a[] = "hello";
Run Code Online (Sandbox Code Playgroud)
它相当于:
char a[] = {'h','e','l','l','o','\0'};
Run Code Online (Sandbox Code Playgroud)
所以你的数组实际上是6而不是5.当你这样做
printf("%c",*(a+5));
Run Code Online (Sandbox Code Playgroud)
没关系 - 打印空终止符是合法的,虽然不常见.打印空字符通常不会产生任何可见输出.
但是,这些是未定义的行为,因为您正在访问数组外的字符:
printf("%c",*(a+6));
printf("%c",*(a+99));
Run Code Online (Sandbox Code Playgroud)
对于未定义的行为,无法保证会发生什么.常见的结果是垃圾或崩溃.