是否从字符串文字初始化的数组与从单个字符初始化的数组相同?

Sle*_*der 1 c arrays string char

有两个数组:

char a[] = "Nice you!";     
char b[] = {'N', 'i', 'c', 'e', ' ', 'y', 'o', 'u', '!'};
Run Code Online (Sandbox Code Playgroud)

我认为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;
}
Run Code Online (Sandbox Code Playgroud)

我的理解是否正确?我不太确定,需要确认.

Jab*_*cky 7

它几乎是一样的.

此数组NUL终止:

char a[] = "Nice you!";
Run Code Online (Sandbox Code Playgroud)

此数组未NUL终止:

char b[] = {'N', 'i', 'c', 'e', ' ', 'y', 'o', 'u', '!'};
Run Code Online (Sandbox Code Playgroud)

数组的确切等价物a如下:

char c[] = {'N', 'i', 'c', 'e', ' ', 'y', 'o', 'u', '!', 0};
                                                         ^ NUL terminator
Run Code Online (Sandbox Code Playgroud)

在您的代码中*(pb + 9)访问数组之外​​的一个元素,因此程序的行为是未定义的.

  • @Alan作为Jabberwocky说`NULL`与`NUL`字符不同,但令人困惑的是"空字符"与`NUL`是一回事.所以你可以说"NUL终结符"或"空终止符",两者都是正确的(但"NULL终结符"不是).https://en.wikipedia.org/wiki/Null_character (3认同)

H.S*_*.S. 6

我认为[]和b []完全一样......

不,他们不一样.差异是空终止字符.

这个

char a[] = "Nice you!";
Run Code Online (Sandbox Code Playgroud)

相当于此

char a[] = {'N', 'i', 'c', 'e', ' ', 'y', 'o', 'u', '!', '\0'};
                                                          ^^^ 
Run Code Online (Sandbox Code Playgroud)

数组的最后一个元素a是空终止字符 - '\0'.

在这

char b[] = {'N', 'i', 'c', 'e', ' ', 'y', 'o', 'u', '!'};
Run Code Online (Sandbox Code Playgroud)

数组的最后一个元素b'!'字符.

数组a字符串1),数组b字符数组.

当我们省略维度时,编译器会根据初始化程序的大小为我们计算它.因此,数组的维度a将是,10而数组的维度b将是9.

在您的程序中,您b使用指针访问超出其大小的数组pb:

printf("*(pb + 9)= %d\n", *(pb + 9));
Run Code Online (Sandbox Code Playgroud)

*(pb + 9)- > p[9]- > 当您尝试访问数组越界时,访问数组10th元素b会导致未定义的行为.


1)C语言没有本机字符串类型.在C中,字符串实际上是由空字符终止的一维字符数组'\0'.