2012-06-04 2 views
2

우선, 가난한 영어에 대해 사과드립니다. 내가 런타임에서 대문자를 입력 초기화하지 않고 문자를 int로 변환 할 때 런타임 오류가 발생하는 이유는 무엇입니까?

void fx(int *a){ 
    for(int i=*a; i<='Z'; i++) 
    printf("%c", i); 
} 
int main(){ 
    int a; 
    scanf("%c", &a); 
    fx(&a); 
    return 0; 
} 

다음 간단한 프로그램에서

은, 그것은 치명적인 오류가 발생하고 였는지를 죽이는 해결되었다.

다음 코드에는 아무런 문제가 없습니다.

//except fx() 
int main(){ 
    int a; 
    scanf("%c", &a); 
    return 0; 
} 

또는

//initialize int a 
void fx(int *a){ 
    for(int i=*a; i<='Z'; i++) 
    printf("%c", i); 
} 
int main(){ 
    **int a = 0;** 
    scanf("%c", &a); 
    fx(&a); 
    return 0; 
} 

나는 그것을 입력 문자에 '문자'이어야한다 알고있다. 그러나 나는 위의 상황에 대해 이해할 수 없다.

무슨 일이 일어 났습니까?

추신. 나는이

int a; 
scanf("%c", &a); 

사이 ++

+1

궁금한 점은 왜 문자를 입력하기 위해'int'를 사용하고 있는지 궁금합니다. 왜'char'가 아닌가? 지옥, 만약 C++로 태그가 붙어 있다면, 왜 'cin'이 아닌가? – chris

+0

>> Chris 방금 ​​테스트 해보았습니다. 그리고 나는 cpp를 사용했기 때문에 태그를 달았습니다. –

답변

2

초기화되지 않은 정수인 으로 선언했으며 맨 아래 바이트를 무언가로 설정했습니다. 가장 큰 바이트 (16 비트 또는 32 비트 정수)가 할당되지 않거나 초기화되지 않은 상태로 남았 기 때문에 결과가 매우 많을 수 있습니다.

함수에 전달하면 표현의 전체 범위를 사용합니다. 그런 다음 정지 조건이 "Z '"가 될 때까지 사이클을 설정합니다.이 상태는 정수로 (즉, 가장 많이 사용되지 않는 모든 바이트를 0으로) 올바르게 올립니다. 그 사이클에서

당신은 내가 'Z'로 롤오버 걸릴 수 있습니다 시간에 따라, 출력을 여러 번 0에서 0xff까지에 걸쳐 바이트, 여러 gazillion을 시도하는 가난한 printf와 강제됩니다. .. 분명히 printf 코드 어딘가에 누군가는 인쇄 할 수없는 (ASCII가 아닌) 코드를 좋아하지 않았습니다.

+0

답변 해 주셔서 감사합니다. 나는 이것이 나를 위해 더 이해할 수 있다고 생각한다. 문제는 ** for 루프 ** '더미 int a'에서 'Z'입니다. –

8

의 차이 c를, VS2010와 함께 일이

int a = 0; 
scanf("%c", &a); 

int a;가 초기화되지 않은 a를 선언한다는 것입니다. 그래서 아무것도 될 수 있습니다. 당신이 초기화되지 않은 int

scanf("%c", &a); 

을 쓸 때 %cchar에 입력을 작성하는 scanf을 알려주기 때문에, 당신은 단지 그렇게 첫 번째 바이트가 기록됩니다, 최상위 비트를 설정하고 있습니다. 이것은 이상한 행동으로 이어질 수 있으며 방금 언급 한 내용을 포함 할 수 있습니다.

+1

이것을 덧붙이면,이 문제가 발생하는 이유는'scanf'가 전달하는 변수의 크기가 얼마나 큰지를 알지 못하기 때문입니다 (포인터가 메모리 주소가 아닌'int' 또는'char '또는 뭐든간에.) – OmnipotentEntity

+2

endianness 문제를 잊지 마라 : a의 첫 8 비트는 최하위 비트를 나타내지 않을 수도있다. –

+0

asnwer에 감사드립니다. 이제 'int'에 대한 'scanf ("% c")'가 단 한 번만 쓰는 것을 이해합니다. –

관련 문제