程序的执行顺序

pra*_*tri 2 c

我有一个关于执行以下程序的问题.

#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);  
}  
Run Code Online (Sandbox Code Playgroud)

当我运行以下时,它输出如下输出:

0x8048521  
0x8048522  
0x8048523  
0x8048524  
0x8048525  
0x8048526  
0x8048527  
0x8048528  
0x8048529  
0x804852a  
Run Code Online (Sandbox Code Playgroud)

然后100秒后打印"0x804852b嘿朋友".虽然声明:printf("%s%s",p,p1); 在睡眠声明之前那么为什么它在睡觉之前不打印而且它再打印一个地址意味着它再次进入循环.有人可以解释一下上述程序的工作原理.它是否与printf函数的缓冲区有关?

Eri*_*rik 11

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

使用:

printf("%s %s\n",p,p1);
Run Code Online (Sandbox Code Playgroud)

要么:

fflush(stdout);
Run Code Online (Sandbox Code Playgroud)

编辑:解决其他问题......

printf("\n%p",p);
Run Code Online (Sandbox Code Playgroud)

这将打印一个换行符第一,然后一个地址.

printf("%s %s",p,p1); 
Run Code Online (Sandbox Code Playgroud)

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

循环完成后,您已经打印了最后一个地址(但它没有刷新).你睡觉了,然后打印一个空字符串,一个空格和原始字符串.

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