为什么功能根据容量返回不同的值

ZpC*_*kTi 0 c string

我正在研究strlen()C中的函数,我看到了一个函数,这个函数返回了diffirent值.如果数组容量已满,则返回错误的结果.如果数组的容量未满,则返回true结果.我问的是什么原因?
非常感谢所有读者.
那就是功能

int myStrlen(char *s)
{
    char *start;
    start = s;
    while (*s != 0)
    {
        ++s;
    }
    return s - start;
}
Run Code Online (Sandbox Code Playgroud)

和主要的

int main()
{
    char x[4] = "What";
    printf("%d\n", myStrlen(x));
    return 0;

}//Output: 21
Run Code Online (Sandbox Code Playgroud)

其他主要的

int main()
{
    char x[5] = "What";
    printf("%d\n", myStrlen(x));
    return 0;

}//Output: 4
Run Code Online (Sandbox Code Playgroud)

cad*_*luk 6

由于尾随空字节,字符串"What"的类型char[5].定义用char[4]截断字符串并削减空字节.

由于在这种情况下缺少null终止符,因此myStrlen调用未定义的行为.

只是用

char str[] = "What";
Run Code Online (Sandbox Code Playgroud)

在实际代码中没有任何明确的数组长度.


而且,正如@Olaf在对你的问题的评论中所说:C没有方法而是功能!
方法在C++中可用,它们是虚函数的别名,在Java中(我没有任何线索).

Stroustroup先生在他的"C++编程语言 4 版" 一书中介绍了C++中的方法,第20.3.2章:

虚拟成员函数有时称为方法.


P.P*_*.P. 5

有了这个功能

int main()
{
    char x[4] = "What";
    printf("%d\n", myStrlen(x));
    return 0;

}//Output: 21
Run Code Online (Sandbox Code Playgroud)

中没有空终结符x.所以它未定义myStrlen()循环,寻找null终止符,任何结果都是可能的.

赋值本身是有效的,并且字符串文字的前四个字节"What"被复制到x.但是该数组x不能用作C字符串.