有两个数组:
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;
}
我的理解正确吗?我不太确定,需要确认。
答案 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)
a
和b
相同。
尽管有一点区别。数组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[]
将输出的内容是不确定的。
谢谢...!