c - 程序的执行顺序

标签 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);  
}  

当我运行下面的命令时,输出如下:

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

然后在 100 秒后打印“0x804852b 嘿 friend 们”。虽然语句:printf("%s %s",p,p1);在 sleep 语句之前那么为什么它在进入休眠之前不打印而且它再打印一个地址意味着它再次进入循环。有人可以解释一下上面程序的工作原理。是否与printf函数的缓冲区有关?

最佳答案

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

使用:

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

或者:

fflush(stdout);

编辑:解决另一个问题...

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

这会打印一个换行符首先,然后是一个地址。

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

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

当循环完成时,您已经打印了最后一个地址(但它没有被刷新)。你 sleep ,然后打印一个空字符串、一个空格和原始字符串。

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

关于c - 程序的执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5197313/

相关文章:

c - 如何在 C 语言中预取指针,针对 AMD Opteron 6168?

编译 64 位 Linux 的 32 位 GTK+ 应用程序

c typedef(ed) 不透明指针

c++ - 在 macOS 上的 VS Code 中,在终端中运行 C/C++ 代码而不是调试控制台?

c - 存储命令行使用的简单数据的好方法是什么?

c - 删除 root 权限

c - 从由前缀和后缀指定的字符数组中提取字符串

c - 隐式函数声明情况下的默认参数提升

c++ - C - 使用 lseek() 获得的不准确的 read() 位置

c++ - 关于优化的数学函数、范围和区间