2017-02-17 66 views
-1

我开始学习c编程语言,当我做一个练习时,我看到一个非常奇怪的错误,确保这是真正的错误,而不是程序中的其他内容,我写的另一个项目printf在循环前似乎工作不同

代码:

1 #include <stdio.h> 
    2 
    3 int main(){ 
    4   printf("ciao come va"); 
    5   for(;;); 
    6   return 0; 
    7 } 

的gcc -o测试的main.c ; ./test --->和回报是(谭坦谭) 没事!在我的外壳上没有出现任何东西!

和过程不返回,我的系统监视器上,我看到它,所以这意味着它是进入了死循环

我的第一个问题是:为什么我不显示任何信息? printf正在调用befor循环!

用gcc -S我编译并没有Assamble,也是汇编代码接缝是正确的

1   .file "main.c" 
    2   .section  .rodata 
    3 .LC0: 
    4   .string "ciao come va" 
    5   .text 
    6   .globl main 
    7   .type main, @function 
    8 main: 
    9 .LFB0: 
10   .cfi_startproc 
11   pushq %rbp 
12   .cfi_def_cfa_offset 16 
13   .cfi_offset 6, -16 
14   movq %rsp, %rbp 
15   .cfi_def_cfa_register 6 
16   movl $.LC0, %edi 
17   movl $0, %eax 
18   call printf 
19 .L2: 
20   jmp  .L2 
21   .cfi_endproc 
22 .LFE0: 
23   .size main, .-main 
24   .ident "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609" 
25   .section  .note.GNU-stack,"",@progbits 

我不很清楚组装,但我看到的printf被称为以前生产循环!

那么它怎么可能?

第二个问题:如果我为静态字符串添加“\ n”,它就像我期望的那样工作!

1 #include <stdio.h> 
    2 
    3 int main(){ 
    4   printf("ciao come va\n"); 
    5   for(;;); 
    6   return 0; 
    7 } 

结果是:侨前来VA

和过程中不要因为返回循环 ,如我所料

汇编代码是:

1   .file "main_con_new_line.c" 
    2   .section  .rodata 
    3 .LC0: 
    4   .string "ciao come va" 
    5   .text 
    6   .globl main 
    7   .type main, @function 
    8 main: 
    9 .LFB0: 
10   .cfi_startproc 
11   pushq %rbp 
12   .cfi_def_cfa_offset 16 
13   .cfi_offset 6, -16 
14   movq %rsp, %rbp 
15   .cfi_def_cfa_register 6 
16   movl $.LC0, %edi 
17   call puts 
18 .L2: 
19   jmp  .L2 
20   .cfi_endproc 
21 .LFE0: 
22   .size main, .-main 
23   .ident "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609" 
24   .section  .note.GNU-stack,"",@progbits 

所以,你如何看到17行,被调用的函数是put而不是printf!

所以第二个问题是:为什么第二个代码的作品和第一个不是? 为什么如果我在程序中调用printf在程序集中被称为puts?为什么只有我在字符串中写入新行“\ n”字符?

回答

2

它不会显示,因为标准输出是行缓冲的,并且不包含换行符。数据被卡在缓冲区中,直到打印换行符(或程序结束,但您的程序不结束)。

要修复,添加一个新行:

printf("ciao come va\n"); 
        ^
        | 
        boom! 
+0

好的,如果我undestood很好,当我调用printf我真的不打印我的屏幕上,但我'在我的记忆中的缓冲区写入,它是正确?当按下时,我的操作系统的内核是否在屏幕上打印:ENTER或我的程序结束? –