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

时间:2018-07-17 08:59:11

标签: 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;
}

我的理解正确吗?我不太确定,需要确认。

5 个答案:

答案 0 :(得分:7)

几乎一样。

此数组以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)中访问数组之外​​的一个元素,因此程序的行为是不确定的。

答案 1 :(得分:6)

  

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

不,他们不一样。区别在于终止符为空。

char a[] = "Nice you!";

等效于此

char a[] = {'N', 'i', 'c', 'e', ' ', 'y', 'o', 'u', '!', '\0'};
                                                          ^^^ 

数组a的最后一个元素是终止于null的字符-'\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的{​​{1}}元素会导致undefined behavior,因为您尝试访问不受限制的数组。


1)C语言没有本机的 string 类型。在C语言中,字符串实际上是一维字符数组,以空字符b结尾。

答案 2 :(得分:1)

ab相同。

尽管有一点区别。数组a的最后一个位置为Null Character,即\0

在数组b的最后一个索引中将有!的地方

答案 3 :(得分:1)

  

我认为a []和b []完全相同

不,他们不一样。

char a[] = "Nice you!";

是一个满足C“字符串”所有条件的字符数组-它以'\0'字符隐式终止。您可以使用puts( a )之类的电话安全地打印它。

char b[] = {'N', 'i', 'c', 'e', ' ', 'y', 'o', 'u', '!'};

只是一个字符数组。它'\0'字符隐式终止。尝试使用puts( b )之类的字符进行打印是未定义的行为。

答案 4 :(得分:0)

是的,a[]b[]几乎相同。

在这里a[]是一个字符串(尽管C中没有名为string的数据类型)。当您像这样a[]声明char a[] = "Nice you!"时,它就像一个自动字符数组,并且编译器放入NUL'\0')来定义字符串的结尾。

但是,当您声明类似char b[] = {'N', 'i', 'c', 'e', ' ', 'y', 'o', 'u', '!'}的内容时,则意味着您非常用自己的方式声明了一个字符数组,而不是内置的char数组。因此,它在NUL之后不包含'\0''!')。实际上,第二个数组b[]将输出的内容是不确定的。

谢谢...!