c - printf 似乎在永远循环之前工作不同

标签 c loops assembly printf puts

我开始学习c编程语言,当我做练习时,我看到一个非常奇怪的错误,可以确定这是真正的错误,而不是程序中的其他错误,我在另一个项目中编写了它

代码是:

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

gcc -o test main.c ; ./test ---> and the return is(TAN TAN TAN) nothing ! On my shell didn't appeare anything!

并且该进程没有返回,在我的系统监视器上我看到了它,所以这意味着它永远进入了 for 循环

我的第一个问题是:为什么我不打印任何东西? printf 在 for 循环之前调用!

使用 gcc -S 我编译而不是汇编,并且汇编代码接缝是正确的

  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 }

The result is : ciao come va

并且该过程不会返回,因为 for 循环 ,正如我所料

汇编代码是:

  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行看到,调用的函数是puts而不是printf!

所以第二个问题是:为什么第二个代码有效而第一个代码无效? 为什么如果我在汇编中的 C 程序中调用 printf ,则第一个称为 put ?为什么我只在字符串中写入新行“\n”字符?

最佳答案

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

要修复,请添加换行符:

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

关于c - printf 似乎在永远循环之前工作不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42302375/

相关文章:

c - 如何在 C 中调用(不定义)具有可变参数的函数?

c - 为什么我的函数会产生冲突类型错误?

c - clang 和 gcc 之间的 float 操作结果不一致

javascript - 仅在解析异步函数后如何使嵌套循环继续,或者如何将 ".then"扩展到范围之外

c - 如何用C程序打包配置文件?

java - 使用java在环形平面上包含/排除

Javascript:无法从循环内部修改在循环外部声明的数组

include - NASM - 相关包含文件

assembly - 8086程序中.model small的含义是什么?

c - execve x86 - 段错误