所谓的 strlen() 其实就是下面一段代码:
int strlen(char *p)
{
int len=0;
while(*p++) ++len;
return(len);
}
这个是运行时生成,你那源串是随机串,里面很可能没有结束 0(你可以用 for 循环输出其中的值看看),这样上面的代码自然就会读内存越界,已经在 strlen() 函数里面出现错误(函数输入错误导致运行错误)。至于 sizeof 没有问题,实际上是因为这个是个操作符,而不是函数,它的值是在编译时生成(一次性),在生成可执行文件中只存在对应的数值,而且它的值只是依据你的变量定义,而不管其它(里面的值是什么,正常异常等),而不是象 strlen() 是在运行时再运转得具体值(可能多次运行)。
说点废话,任何一个函数的正确运行都有个前提,那就是输入参数的正确有效性,只有在输入正确有效的前提下,函数的输出才可能正确、有意义,否则就是进去的是垃圾,出来的也是垃圾(而当这时讨论出来点啥没有任何意义)。象 strlen() 这个函数就要求输入必须是个有效的字符串,而 c 里字符串如果用 char * 就必须是 0 结束的字符指针,而你这段代码里的输入只是个未初始化的字符数组 char a[10] 啥的,在变量有效的 0,9 的范围内它不一定是字符串,当运行到 strlen() 函数时就已经运行错误了,只是因为 c 是个中级语言,弱类型语言,而 char * 又是个基本数据类型,对于各种这类运行时的错误它不一定会出异常提示,因此这次你没有看到任何程序崩溃、异常提示,比较幸运,但是如果你经常这么干,你就不会总这么幸运了。
str[10];
数组里没有赋值,
strlen用来判断C标准字符串的长度
int strlen(char *p)
{
int len=0;
while(*p++) ++len;
return(len);
}
这个是运行时生成,你那源串是随机串,里面很可能没有结束 0(你可以用 for 循环输出其中的值看看),这样上面的代码自然就会读内存越界,已经在 strlen() 函数里面出现错误(函数输入错误导致运行错误)。至于 sizeof 没有问题,实际上是因为这个是个操作符,而不是函数,它的值是在编译时生成(一次性),在生成可执行文件中只存在对应的数值,而且它的值只是依据你的变量定义,而不管其它(里面的值是什么,正常异常等),而不是象 strlen() 是在运行时再运转得具体值(可能多次运行)。
说点废话,任何一个函数的正确运行都有个前提,那就是输入参数的正确有效性,只有在输入正确有效的前提下,函数的输出才可能正确、有意义,否则就是进去的是垃圾,出来的也是垃圾(而当这时讨论出来点啥没有任何意义)。象 strlen() 这个函数就要求输入必须是个有效的字符串,而 c 里字符串如果用 char * 就必须是 0 结束的字符指针,而你这段代码里的输入只是个未初始化的字符数组 char a[10] 啥的,在变量有效的 0,9 的范围内它不一定是字符串,当运行到 strlen() 函数时就已经运行错误了,只是因为 c 是个中级语言,弱类型语言,而 char * 又是个基本数据类型,对于各种这类运行时的错误它不一定会出异常提示,因此这次你没有看到任何程序崩溃、异常提示,比较幸运,但是如果你经常这么干,你就不会总这么幸运了。
str[10];
数组里没有赋值,
strlen用来判断C标准字符串的长度