2013-07-21 1 views
-2

,문자열을 int 변수에 입력 하시겠습니까? 다음 코드에서

#include<stdio.h> 
int main() 
{ 
    int i=5; 
    scanf("%s", &i); 
    printf("%d\n", i); 
    return 0; 
} 

나는 i의 주소에 저장되어있는 입력 문자열을. 변수 i을 인쇄하려고하면 숫자가 표시됩니다.

예 :

INPUT :
hello
출력 : 1819043176

어떤 수 이것이 정확히 무슨 일이 일어나고 있는지
?

+3

[정의되지 않은 동작] (http://en.wikipedia.org/wiki/Undefined_behavior)으로 알려진 현상이 있습니다. –

답변

4

이 프로그램은 사용자가 읽은 문자열을 변수 i가 점유하고 지나간 메모리에 씁니다. 이것은 정의되지 않은 동작이므로 아무 것도 발생할 수 없습니다.

무엇 실제로 일어나는 것은 컴퓨터 int에 4 개 char의 크기이며, ASCII로 변환하여 CPU에 바이트 순서에서 숫자로 해석 할 때 문자 "지옥", 숫자로 밝혀이다 1819043176. 문자열의 나머지 부분 인 문자 o와 종료 문자는 사용자 컴퓨터에 저장된 위치의 끝을 지나치게됩니다. 그래서 scanf하는 일은 이것이다 : 바이트 68 65 6c 6c가 INT에 저장되는 경우가 수 0x6c6c6568, 또는 10 진수의 1819043176으로 해석이야 있도록

h e l l o \0 
|68 65 6c 6c|6f 00 ... 
|   i|memory past i 

당신은, 리틀 엔디안 시스템에서이 작업을 실행 할 것으로 보인다.

int이 다른 크기이거나 다른 문자 세트 (예 : ASCII 대신 EBCDIC)를 사용하거나 CPU가 빅 endian 바이트 순서를 사용하거나 프로그램이 메모리 쓰기가 바인드 된 환경에서 실행되는 경우 -checked, 당신은 다른 결과 또는 프로그램 충돌을 얻을 것이다. 즉, 정의되지 않은 동작입니다.

관련 문제