#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-1
是13
?
答案 0 :(得分:8)
while(*ptr++);
当ptr
指向传递的字符串的终止0时,仍然递增ptr
,所以在此之后它指向0终结符。
以"Princess Leia"
为参数,ptr
增加14次,因此返回值为14 - 1 = 13
。
打印的内容是 - 除了未定义的行为,因为解除引用ptr
通常是未定义的行为,当它指向0终结符(它在这里)之后,实际上 - 传入的字符串,以及下面的字节它的0终结符。这里是"%d\n"
,因为格式字符串"%d\n" happened to be stored just after
“莱娅公主”。
答案 1 :(得分:3)
你很幸运。
最终,ptr
指向Princess Leia
的终止空后的字节。这不是不合理的,而是指向您定义的下一个const char
,即%d\n
。
这是未定义的行为(即使它模糊可预测),不依赖它。