3
#include <stdio.h>
int myfunc(char *str)
{
    char *ptr =str;
    while(*ptr++);
    printf("%s %s\n",str,ptr);
    return ptr-str-1;

}    
int main()
{
    printf("%d\n", myfunc("Princess Leia"));
    return 0;
}

输出:

Princess Leia %d

13

ptr 如何%d在其中获得字符串?为什么ptr-str-113

4

2 回答 2

8
while(*ptr++);

当指向传递的字符串的终止 0ptr时仍会递增,因此之后它指向 0 终止符的后面。ptr

使用"Princess Leia"作为参数,ptr递增 14 次,因此返回值为14 - 1 = 13.

打印的是 - 除了未定义的行为,因为ptr当它指向 0 终止符(它在这里)之后时,解引用通常是未定义的行为,实际上 - 传入的字符串和其 0 终止符之后的字节。在这里"%d\n",由于格式字符串"%d\n" happened to be stored just after“莱娅公主”。

于 2013-06-20T11:42:51.657 回答
3

你好幸运啊。

您最终ptr指向了终止 null for 之后的字节Princess Leia。并非不合理,这是指向const char您定义的下一个,即%d\n.

这是未定义的行为(即使它是模糊可预测的),不要依赖它

于 2013-06-20T11:42:20.913 回答