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

时间:2017-07-17 14:10:38

标签: c string sizeof strlen pointer-arithmetic

#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,有人可以解释一下吗?

1 个答案:

答案 0 :(得分:0)

使用指针算术。为了更清楚,只需运行这个示范程序。

#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