糖豆广场舞美丽的遇见:关于字符数组中结束符的问题

来源:百度文库 编辑:神马品牌网 时间:2024/05/04 21:56:07
# include<iostream>
# include<string.h>
using namespace std;
int main()
{
char s1[10];
s1[0]='1',s1[1]='2',s1[2]='3';
cout<<strlen(s1);
return 0;
}
帮忙解释一下为什么输出的长度是15,strlen好像是碰到结束符就结束,算之前的长度,这里没定义结束符,那是为什么呢?

所谓的 strlen() 其实就是下面一段代码:

int strlen(char *p)
{
int len=0;

while(*p++) ++len;
return(len);
}
这个是运行时生成,你那源串是随机串,里面很可能没有结束 0(你可以用 for 循环输出其中的值看看),这样上面的代码自然就会读内存越界,已经在 strlen() 函数里面出现错误(函数输入错误导致运行错误)。至于 sizeof 没有问题,实际上是因为这个是个操作符,而不是函数,它的值是在编译时生成(一次性),在生成可执行文件中只存在对应的数值,而且它的值只是依据你的变量定义,而不管其它(里面的值是什么,正常异常等),而不是象 strlen() 是在运行时再运转得具体值(可能多次运行)。
想得到数组长度应该用sizeof
字符串长度用strlen

没定义的话,指针就一直往后移,一直到内存中某处的数据为0时就结束掉了,你这里出现15完全是随机的,下次运行可能是其它的数。