strlen函数 辨析

 所谓的 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标准字符串的长度
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值