考虑一下程序
#include<stdio.h>
int main()
{
char a[] = "hello";
printf("%c", *(a + 5));
printf("%c", *(a + 6));
printf("%c", *(a + 99));
return 0;
}
这里第一个printf是打印NULL还是垃圾值?最后两个printf怎么样?
我很困惑,因为我在数组绑定之外访问。
答案 0 :(得分:7)
创建像这样的字符数组时
char a[] = "hello";
相当于:
char a[] = {'h','e','l','l','o','\0'};
所以你的数组实际上大小为6而不是5.当你做
时printf("%c",*(a+5));
没关系 - 打印空终结符字符是合法的,虽然不常见。打印空字符通常不会产生任何可见的输出。
但是,这些是未定义的行为,因为您正在访问数组外的字符:
printf("%c",*(a+6));
printf("%c",*(a+99));
对于未定义的行为,无法保证会发生什么。常见的结果是垃圾或崩溃。
答案 1 :(得分:1)
你的数组有6个有效字符。
所以a[0]
到a[5]
是有效访问除了数组越界访问之外的任何东西,这将导致未定义的行为