有两个数组:
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]
->访问数组b
的10th
元素会导致在试图越界访问数组时出现未定义的行为。
1(C语言没有本机字符串类型。在C中,字符串实际上是以空字符' '
结尾的一维字符数组。
我认为a[]和b[]完全相同
不,它们不一样。
char a[] = "Nice you!";
是一个符合C"字符串"所有条件的字符数组,它由一个' '
字符隐式终止。您可以使用puts( a )
等调用安全地打印它。
char b[] = {'N', 'i', 'c', 'e', ' ', 'y', 'o', 'u', '!'};
只是一个字符数组。它不是用' '
字符隐式终止的。试图用类似puts( b )
的东西打印它是未定义的行为。
a
和b
是相同的。
不过有一点不同。数组a
的最后一个位置将有Null Character
,即