访问数组的NULL字符

时间:2015-10-05 14:04:21

标签: c arrays

考虑一下程序

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

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

2 个答案:

答案 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]是有效访问除了数组越界访问之外的任何东西,这将导致未定义的行为