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



有两个数组:

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)= %dn", *(pa + 9));
printf("*(pb + 9)= %dn", *(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)访问数组之外的一个元素,因此程序的行为是未定义的。

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

不,它们不一样。区别是null终止字符。

这个

char a[] = "Nice you!";

相当于这个

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

数组a的最后一个元素是以null结尾的字符-''

在这个中

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

数组CCD_ 9的最后一个元素是CCD_。

数组a字符串1(,数组b是字符的数组

当我们省略维度时,编译器会根据初始值设定项的大小为我们计算它。因此,阵列a的维度将是10,而阵列b的维度将为9

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

printf("*(pb + 9)= %dn", *(pb + 9));

*(pb + 9)->p[9]->访问数组b10th元素会导致在试图越界访问数组时出现未定义的行为。


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

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

不,它们不一样。

char a[] = "Nice you!";

是一个符合C"字符串"所有条件的字符数组,它由一个''字符隐式终止。您可以使用puts( a )等调用安全地打印它。

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

只是一个字符数组。它不是用''字符隐式终止的。试图用类似puts( b )的东西打印它是未定义的行为。

ab是相同的。

不过有一点不同。数组a的最后一个位置将有Null Character,即

其中,作为阵列b将在其最后索引处具有!

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

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

但是,当您声明像这样的char b[] = {'N', 'i', 'c', 'e', ' ', 'y', 'o', 'u', '!'}时,这意味着您以自己的方式声明了一个字符数组,而不是以内置char数组的方式。因此,它在'!'之后不保持NUL(''(。事实上,第二阵列b[]将打印什么是未定义的。

谢谢。。。!

最新更新