2014-02-23 1 views
1

일부 웹 사이트를 통해 포인터가 매달려있는 프로그램을 검색하고 발견했습니다. TC에서 완벽하게 실행되는 최고의 프로그램을 찾았습니다. 그러나 fflush (stdin)에 대한 나의 의심 때문에 프로그램의 전체적인 의미를 이해할 수는 없습니다. 그래서 의미와 다음과 같은 프로그램의 다른 절차를 알려주세요 : 인해 argument.for 예다음 프로그램에서 "fflush (stdin)"의 정확한 의미는 무엇입니까?

#include<stdio.h> 
    int *call(void); 
    int main(void) { 
     int *ptr; 
     ptr = call(); 
     fflush(stdin); 
     printf("%d", *ptr); 
     return 0; 
    } 
    int *call(void) { 
     int x = 25; 
     ++x; 
     return &x; 
    } 
+0

아니요 @Banthar. 그 질문은 구체적이지 않습니다. 하지만 내 의심은 특히 위의 프로그램에 있습니다. – kalyan

+1

자동 변수의 주소를 반환하고 사용하기 때문에 UB이기도합니다. – Jens

답변

3

fflush(stdin)은 일반적으로 정의되지 않은 동작이므로 대답이 줄 바꿈 아래의 this answer을 보는 이유에 대한 설명은 없습니다.

fflush() 버퍼는 이와 같은 컨텍스트에서 사용되는 경우 일반적으로 입력 버퍼 플러시 시도에 사용됩니다 stdin. 따라서 버퍼가 깨끗한 상태에있는 "보류 중"인 것은 없습니다.

특히이 프로그램에는 전혀 문제가 없습니다. 입력 작업이 없으므로 아무 것도 수행하지 않습니다. *.

는 * 물론 "정의되지 않은 동작은"아무것도 그것이 뭔가을 할 수 있도록 일어날 수있는 의미하지만 점검이 플랫폼을 지원하며 예상대로 코드에 명백한 효과가 없을 것입니다 버퍼를 삭제하지 .

+1

당신이 말했듯이 그것은 UB이기 때문에 뭔가 잘 할 수 있습니다 (비강 악마 등). 그러나'fflush (stdin)'이 스트림에서 버퍼링 된 입력을 비우는 플랫폼에서는 실제로 아무것도하지 않을 것이다. – sepp2k

+0

@ sepp2k - 그래, 내가 그걸 썼다면 나는 생각했다. 그러나 그때 나는 "아니, 아무도 나를 그렇게 부르지 않을거야"라고 생각했다. ;) 예, 물론 UB처럼 * 할 수있는 것이 맞습니다. – Mike

0
FFLUSH의 목적은 청소하거나 생성 된 버퍼를 플래시하는 것입니다

char ch [10]; 
scanf("%s",ch); // here scanf finishes taking input after tou pressed enter and that enter may still remain in keyboardbuffer 
fflush(stdin); //flushes that enter which is in keyboard buffer 

이제 경우 가정을 우리 FILE 포인터를 사용하여 파일에 ch를 쓰면 파일에 원하는 출력이 생깁니다. 당신이

fflush(stdin); 

을 사용하지 말아 그리고 당신은 당신이 다음 쓰기이 때문에 키보드 버퍼에 입력의 효과에 파일에 새로운 행에 기록됩니다 각 each.time 파일에 채널을 작성하려면 supose 경우 바람직하지 않다.

+1

이것은 정의되지 않은 동작이며, 그렇지 않은 경우에도 주어진 코드에 입력 작업이 없으므로 'fflush'를 사용하여 나머지 입력을 지우는 것은 무의미합니다. 나는 또한 당신의 첫 번째 문장에서 "그 논쟁으로 인해서"당신이 의미하는 바를 확신하지 못합니다. – sepp2k

+0

"인수로 인해 생성되었습니다"즉, 우리는 버퍼를 정리하려는 인수를 사용합니다. – YakRangi

+0

그리고 내 자신의 예제로 fflush의 함수를 지정합니다. – YakRangi

2

이 특정 경우에 fflush(stdin)ptr의 내용을 덮어 쓰는 데 사용됩니다. 모든 함수는 매달려있는 스택 포인터를 덮어 쓰는 경향이 있습니다. 임의로 선택된 fflush(stdin)처럼 보입니다. 이와 비슷한 결과가 나타납니다.

#include<stdio.h> 

int* call(void); 
int* dummy(void); 

int main(){ 
    int *ptr; 
    ptr=call(); 
    printf("%d\n",*ptr); 
    dummy(); 
    printf("%d\n",*ptr); 
    return 0; 
} 

int* dummy(void) { 
    int x=0; 
    return &x; 
} 

int* call(void){ 
    int x=25; 
    ++x; 
    return &x; 
} 
+0

이 코드는 원본 : UB의 범위를 벗어나는 (& x를 통해) 객체의 주소 사용으로 인해 손상되었습니다. – Jens

+1

@Jens 그게 핵심이라고 생각합니다. 그것은 매달려있는 포인터의 위험성을 보여 주기로되어 있습니다. –

관련 문제