C和C++中,字符串都以'\0'结尾,这样我们就能很方便的找到字符串的尾部,但由于这个问题,每个字符串都有一个额外字符的开销,稍不留神就会造成字符串的越界。例入下面的代码:
int main()
{
char s[10];
char a[] = "0123456789";
strcpy(s, a);
cout << s << endl;
return 0;
}
这个程序的结果是程序会奔溃,因为s只申请了10个字节,而a加上'\0'有11个字节,放不下,所以会奔溃
那我们来继续看下面的代码,猜猜程序的结果:
int main()
{
char a[] = "nihao";
char b[] = "nihao";
char *p = "nihao";
char *q = "nihao";
if (a == b) // 不相等
{
cout << "相等" << endl;
}
else
{
cout << "不相等" << endl;
}
if (p == q)//相等
{
cout << "相等" << endl;
}
else
{
cout << "不相等" << endl;
}
return 0;
}
运行的结果是不是有点出乎意料?
那是因为,我们会给字符串数组a和b分配两个空间,并吧“nihao”分配到数组空间中去,因为起始地址不同,所以两个数组不同
p和q是两个指针,我们无需为他们分配内存空间用来存储字符串的内容,只需要把他们指向"nihao"在内存中的地址就行了
由于“nihao”是个常量字符串,它在内存中只有一个拷贝,因此p和q指向的是同一块地址,所以相同。