2011-03-04 213 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"它會更清楚發生了什麼。