快速的问题

Lea*_*ngC 6 c string strlen

我已经开始打扰你了另一个可能非常简单的C问题.

使用以下代码:

int get_len(char *string){

    printf("len: %lu\n", strlen(string));

    return 0;
}

int main(){

    char *x = "test";
    char y[4] = {'t','e','s','t'};

    get_len(x); // len: 4
    get_len(y); // len: 6

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

2个问题.为什么他们不同,为什么是6?多谢你们.

编辑:对不起,我知道会解决什么问题,我只是想了解发生了什么.那么strlen只是继续转发这个点,直到碰巧找到一个\ 0?此外,当我在主函数而不是get_len函数中执行strlen时,两者都是4.这只是巧合吗?

Fre*_*son 14

y不是以null结尾. strlen()计算字符直到它遇到空字符.你的碰巧在6点之后找到了一个,但它可能是任何数字.试试这个:

char y[] = {'t','e','s','t', '\0'};

这是一个strlen()可能看起来像的实现(在我的头顶 - 没有我的K&R书很方便,但我相信那里有一个实现):

size_t strlen(const char* s)
{
    size_t result = 0;
    while (*s++) ++result;
    return result;
}
Run Code Online (Sandbox Code Playgroud)

  • @LearningC:是的.或者直到它以段错误的方式崩溃.或者直到它格式化你的硬盘.如果您的输入不是零终止,则行为是*undefined*.*任何事情都可能发生. (4认同)
  • @LearningC:你的函数调用者需要终止字符串,就像`strlen`或`strcpy`的调用者要求输入是以空字符结尾的字符串一样. (2认同)