2017-02-17 9 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) 아무것도 아닙니다! 내 껍질에 아무것도 appepare하지 않았다!

프로세스가 반환하지 않는, 내 시스템 모니터에 내가 그것을보고, 그래서 그것으로 의미 루프 영원히

내 첫 번째 질문은 : 내가 아무것도 인쇄되지 않는 이유는 무엇입니까? 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와 보았다는 루프을 befor라고합니다!

그래서 어떻게 가능합니까?

두 번째 질문 : "\ n"을 정적 문자열에 추가하면 예상대로 작동합니다!

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

결과는 다음과 같습니다 챠오 루프 의 때문에 반환하지 않습니다

프로세스 v 여러 와서, 어셈블리 코드는 내가

를 예상대로 :

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를 호출하면 puts라고 부릅 니 까? 왜 내가 문자열에 새로운 줄 "\ n"을 쓰는 것일까?

답변

2

표준 출력이 라인 버퍼이므로 줄 바꿈을 포함하지 않으므로 표시되지 않습니다. 데이터는 개행 문자가 인쇄 될 때까지 (또는 프로그램이 끝날 때까지 버퍼에 고정됩니다.

추가, 줄 바꿈 해결하려면 : 나는 잘 undestood 경우 내가 정말 내 화면에 인쇄되지 않지만 I'am 내 메모리의 버퍼에 쓰기의 printf를 호출 할 때,

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

확인, 그것은이다 옳은? Enter 키를 누르거나 프로그램을 끝낼 때 화면에 인쇄하는 것보다 내 OS의 커널이 맞습니까? –