2017-02-21 4 views
2

연습 문제 3-5에서 C 프로그래밍 언어에서 작업하면서 다음과 같은 예기치 않은 동작이 발생했습니다.C 프로그램에서 변수가 왜 변형 되었습니까?

#include <stdio.h> 
#include <string.h> 

// inspired by: http://www.eng.uerj.br/~fariasol/disciplinas/LABPROG/C_language/Kernighan_and_Ritchie/solved-exercises/solved-exercises.html/krx305.html 

void reverse(char s[]) { 
    int c, i, j; 
    for (i = 0, j = strlen(s)-1; i < j; i++, j--) { 
     c = s[i]; 
     s[i] = s[j]; 
     s[j] = c; 
    } 
} 

void itob(int n, char s[], int b) { 
    static char digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    int i = 0, 
     sign; 

    if (b < 2 || b > 36) { 
     fprintf(stderr, "EX3_5: Cannot support base %d\n", b); 
    } 

    if ((sign = n) < 0) { 
     n = -n; 
    } 

    do { 
     s[i++] = digits[n % b]; 
    } while (n /= b); 

    if (sign < 0) { 
     s[i++] = '-'; 
    } 

    s[i] = '\0'; 

    reverse(s); 
} 

int main() { 
    int base = 2, 
     input; 
    char buffer[5] = "0000"; 

    input = 127; 
    itob(input, buffer, base); 
    printf("%d in base %d is %s\n", input, base, buffer); 
    // 127 in base 2 is 1111111 

    input = 128; 
    itob(input, buffer, base); 
    printf("%d in base %d is %s\n", input, base, buffer); 
    // 0 in base 2 is 10000000 
    // Why is input now 0?! 

    return 0; 
} 

가 왜 input되는 변수의 값 (input127보다 큰 경우에만) 변화 ? 나는 C를 처음 접했지만 이것은 예상치 못한 것처럼 보입니다. 필자가 이해하는 한, 함수 인수는 값별로 전달됩니다.

+4

수보다 큰 변환 할 수 없습니다, 더 큰 buffer 크기를 사용하는 것을 시도'buffer' 충분히 크지 않다. 버퍼 오버 플로우 및 정의되지 않은 동작이 있습니다. – user2357112

+0

배열 함수 매개 변수는 포인터 매개 변수로 조정됩니다. 포인터는 값으로 전달되지만 호출자의 메모리에 액세스하는 데 사용할 수 있습니다. –

+0

@ user2357112 감사합니다. 의견을 답변으로 추가하면 기꺼이 받아 들일 것입니다. – pdoherty926

답변

5

버퍼가 충분히 크지 않습니다. 당신은 4 개 문자를위한 공간과 null 종결 할당 :

char buffer[5] = "0000"; 

을하지만 당신은 itob(input, buffer, base); 거기에 8 개 문자와 null 종결 물건을 시도하고 있습니다. 이로 인해 버퍼 오버플로 및 정의되지 않은 동작이 발생합니다.

3

는 4 문자로는 127

+1

127에겐 충분하지 않습니다. – user2357112