2017-02-17 38 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 ---> и возврат (TAN TAN TAN) ничего! На моей раковине ничего не было!

и процесс не возвращаются, на моей системе монитора я видел его, так что это означает, что в для цикла навсегда

мой первый вопрос: почему я ничего не печатать? printf - вызов befor loop!

с 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 называется Befor петлю!

Так как же это возможно?

второй вопрос: если я добавлю «\ n» в статическую строку, она работает так, как я ожидаю!

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

Результат: чао приходят ва

и процесс не возвращаются, потому что цикл , как я ожидаю

Код Ассамблея:

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, функция, которая была вызвана ставит и не печатаетf!

так что второй вопрос: почему второй код работает, а первый нет? и почему, если я вызываю printf в моей программе c в сборке, один называется puts? и почему только я пишу новую строку «\ n» в строке?

ответ

2

Это не отображается, потому что стандартный вывод буферизируется по строке, и вы не указали новую строку. Данные застревают в буфере, пока не будет напечатана новая строка (или программа закончится, а ваша - нет).

Чтобы исправить, добавить новую строку:

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

ок, если я undestood хорошо, когда я называю Printf я на самом деле не печатать на моем экране, но I'am писать на буфер в моей памяти, это верный? Является ли ядром моей ОС, чем печать на экране, когда нажимаете: ENTER или моя программа заканчивается? –