C 单字符上的Strlen函数行为

C 单字符上的Strlen函数行为,c,char,strlen,null-character,C,Char,Strlen,Null Character,这是我的密码: void func(char c) { char * ptr = &c; size_t len = strlen(ptr); printf("len - %d\n", len); } len始终打印为1 strlen(..)通过在数组末尾查找空字符(\0)来确定char数组的长度。这里,ptr仅用单个字符(c)的地址初始化c不包含任何空字符。ptr如何获取长度?不能对不指向以null结尾的数组的指针使用strlen()。它调用 一旦你的程序点击U

这是我的密码:

void func(char c)
{
    char * ptr = &c;
    size_t len = strlen(ptr);
    printf("len - %d\n", len);
}
len
始终打印为1


strlen(..)
通过在数组末尾查找空字符(
\0
)来确定
char
数组的长度。这里,
ptr
仅用单个字符(
c
)的地址初始化<代码>c不包含任何空字符。
ptr
如何获取长度?

不能对不指向以null结尾的数组的指针使用
strlen()
。它调用

一旦你的程序点击UB,什么都不能保证


FWIW,
strlen()。它意外返回1

  • strlen
    的工作原理是从给定地址开始,然后递增该地址,直到到达
    \0
    。这与C标准库建模字符串的方式一致。如果您不拥有起始地址和
    \0
    之间的所有内存(作为连续块),则
    strlen
    的输入格式不正确

  • 由于格式说明符不正确,
    printf
    的行为未定义。将
    %zu
    用于
    大小\u t

  • c不包含任何空字符。ptr如何获得长度

    没有。它似乎在测试中给出了正确答案,因为
    c
    地址后面的内存位置恰好包含一个零字节。此位置未定义为包含零,也不允许程序访问它,因此您不能指望此类代码继续工作

    在C标准的语言中,程序的行为是未定义的,这意味着不仅操作的结果不可预测


    即使不考虑未定义的行为,上面的代码也可能在稍有更改的情况下停止工作—例如,当您更改架构、编译器、甚至编译标志时,或者在混合中添加更多函数时。虽然这样的代码片段有助于了解东西是如何在后台工作的,但它们永远不应该用于生产代码。

    格式说明符应该是
    %zu
    “我的代码有一个bug,为什么它会做一些奇怪的事情?”因为它有一个bug。修复错误,神秘感就会消失。“我做了一件坏事。我知道我做了一件坏事。结果发生了坏事。解释原因'。投反对票:(