我开始学习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/