2011-03-04 130 views
2

我有关于执行下列程序的问题。程序的执行顺序

#include<stdio.h> 

int main(void) 
{  
    char *p="hey friends",*p1; 
    p1=p; 
    while(*p!='\0') 
    { 
     p++; 
     printf("\n%p",p); 
    } 
    printf("%s %s",p,p1); 
    sleep(100); 
} 

当我跑了下面这是给输出如下:

0x8048521 
0x8048522 
0x8048523 
0x8048524 
0x8048525 
0x8048526 
0x8048527 
0x8048528 
0x8048529 
0x804852a 

,然后加入100秒之后它打印“0x804852b哎朋友”。虽然声明:printf(“%s%s”,p,p1);在睡眠声明之前,那么为什么它在睡觉前不打印,而且它正在打印另一个地址意味着它再次进入循环。有人请向我解释上述程序的工作。它是否与printf函数的缓冲区有关?

+1

正常情况下,在找到\ n时将输出刷新到终端。在最后一次迭代中,没有\ n,所以你必须等到程序退出。 – Juancho 2011-03-04 17:47:55

回答

11

stdout是行缓冲的。当您打印\n或退出应用程序时,会发生实际打印输出。

用途:

printf("%s %s\n",p,p1); 

或者:

fflush(stdout); 

编辑:地址其他问题...

printf("\n%p",p); 

这将打印换行第一然后地址。

printf("%s %s",p,p1); 

这会打印一个空字符串(因为p指向0终止符)一个空格和原始字符串。

当循环完成后,您打印了最后一个地址(但未刷新)。你睡了,然后你打印一个空的字符串,一个空格和原始字符串。

如果您更改了最后一个printf使用"%p %s"它会更清楚发生了什么。