无法理解 strlen 表达式参数结果

Can't understand strlen expression argument result

#include "stdio.h"
#include "string.h"
int main(){
    char p[]="CALIFORNIA\n";
    char *x ="HELLO";
    printf("%lu\n",strlen(p+sizeof(p)-sizeof(x)+5) );
}

我找遍了,但找不到当 strlen 的参数是一个表达式时会发生什么。最后一条语句的结果是2,谁能解释一下是怎么回事?

这里用到了指针运算。为了更清楚地说明 运行 这个演示程序。

#include <stdio.h>
#include <string.h>

int main(void) 
{
    char *x ="HELLO";
    const size_t N = strlen( x );

    for ( size_t i = 0; i < N; i++ )
    {
        printf( "%zu - %s\n", strlen( x + i ), x + i );
    }

    return 0;
}

它的输出是

5 - HELLO
4 - ELLO
3 - LLO
2 - LO
1 - O

至于你的例子,那么在这个声明中

printf("%lu\n",strlen(p+sizeof(p)-sizeof(x)+5) );

表达式 p + sizeof( p ) 的类型为 char *,即表达式产生一个指向数组对象 p.

最后一个元素的指针

表达式p + sizeof( p ) - sizeof( x ) 将指针向左移动(在您的系统中似乎 sizeof( x ) 等于 8)。表达式 p + sizeof( p ) - sizeof( x ) + 5 将指针向右移动。

结果整个表达式产生一个指向字符数组中以下位置的指针 p

char p[]="CALIFORNIA\n";
                   ^
                   |

因此看起来像 "A\n" 的字符串的长度等于 2.