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.
nicht konvertieren kann 'buffer' ist nicht groß genug. Sie haben einen Pufferüberlauf und undefiniertes Verhalten. – user2357112
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. –
@ user2357112 Danke - das war es. Wenn Sie Ihren Kommentar als Antwort hinzufügen, nehme ich ihn gerne an. – pdoherty926