奇怪的输出说明

时间:2013-06-20 11:38:23

标签: c

#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

2 个答案:

答案 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

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