访问数组的NULL字符

sam*_*ion -1 c arrays

考虑一下该计划

#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怎么样?

我很困惑因为我在数组绑定之外访问.

Vau*_*ato 7

当你创建这样的字符数组

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)

对于未定义的行为,无法保证会发生什么.常见的结果是垃圾或崩溃.