2017-02-21 3 views
2

Während der Übung 3-5 in Die C-Programmiersprache, bin ich auf das folgende unerwartete Verhalten gestoßen.Warum wird Variable im C-Programm mutiert?

#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; 
} 

Warum wird der Wert der input Variable, geändert (nur wenn input größer als 127)? Ich bin neu in C, aber das scheint sehr unerwartet zu sein. Soweit ich verstehe, sind Funktionsargumente pass-by-value.

+4

nicht konvertieren kann 'buffer' ist nicht groß genug. Sie haben einen Pufferüberlauf und undefiniertes Verhalten. – user2357112

+0

Array-Funktionsparameter werden als Zeigerparameter eingestellt. Während die Zeiger nach Wert übergeben werden, können sie verwendet werden, um auf den Speicher des Aufrufers zuzugreifen. –

+0

@ user2357112 Danke - das war es. Wenn Sie Ihren Kommentar als Antwort hinzufügen, nehme ich ihn gerne an. – pdoherty926

Antwort

5

Ihr Puffer ist nicht groß genug. Sie zugewiesenen Platz für 4 Zeichen und ein Nullabschluss:

char buffer[5] = "0000"; 

aber Sie versuchen, 8 Zeichen und ein Nullabschluss mit itob(input, buffer, base); dort zu stopfen. Dies führt zu einem Pufferüberlauf und zu undefiniertem Verhalten.

3

Versuchen größere buffer Größe zu verwenden, mit nur 4 Zeichen Sie Zahl größer als 127

+1

Es ist nicht einmal groß genug für 127. – user2357112

Verwandte Themen