Sle*_*der 1 c arrays string char
有两个数组:
char a[] = "Nice you!";     
char b[] = {'N', 'i', 'c', 'e', ' ', 'y', 'o', 'u', '!'};
我认为a[]并且b[]完全一样.所以这是我的代码,看看每个数组的最后一个元素后面是什么:
#include <stdio.h>
int main(void)
{
    char a[] = "Nice you!";
    char b[] = {'N', 'i', 'c', 'e', ' ', 'y', 'o', 'u', '!'};
    char *pa;
    char *pb;
    pa = a;
    pb = b;
    printf("*(pa + 9)= %d\n", *(pa + 9));
    printf("*(pb + 9)= %d\n", *(pb + 9));
    return 0;
}
我的理解是否正确?我不太确定,需要确认.
它几乎是一样的.
此数组NUL终止:
char a[] = "Nice you!";
此数组未NUL终止:
char b[] = {'N', 'i', 'c', 'e', ' ', 'y', 'o', 'u', '!'};
数组的确切等价物a如下:
char c[] = {'N', 'i', 'c', 'e', ' ', 'y', 'o', 'u', '!', 0};
                                                         ^ NUL terminator
在您的代码中*(pb + 9)访问数组之外的一个元素,因此程序的行为是未定义的.
我认为[]和b []完全一样......
不,他们不一样.差异是空终止字符.
这个
char a[] = "Nice you!";
相当于此
char a[] = {'N', 'i', 'c', 'e', ' ', 'y', 'o', 'u', '!', '\0'};
                                                          ^^^ 
数组的最后一个元素a是空终止字符 - '\0'.
在这
char b[] = {'N', 'i', 'c', 'e', ' ', 'y', 'o', 'u', '!'};
数组的最后一个元素b是'!'字符.
数组a是字符串1),数组b是字符数组.
当我们省略维度时,编译器会根据初始化程序的大小为我们计算它.因此,数组的维度a将是,10而数组的维度b将是9.
在您的程序中,您b使用指针访问超出其大小的数组pb:
printf("*(pb + 9)= %d\n", *(pb + 9));
*(pb + 9)- > p[9]- > 当您尝试访问数组越界时,访问数组10th元素b会导致未定义的行为.
1)C语言没有本机字符串类型.在C中,字符串实际上是由空字符终止的一维字符数组'\0'.