연습 문제 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
되는 변수의 값 (input
은 127
보다 큰 경우에만) 변화 ? 나는 C를 처음 접했지만 이것은 예상치 못한 것처럼 보입니다. 필자가 이해하는 한, 함수 인수는 값별로 전달됩니다.
수보다 큰 변환 할 수 없습니다, 더 큰
buffer
크기를 사용하는 것을 시도'buffer' 충분히 크지 않다. 버퍼 오버 플로우 및 정의되지 않은 동작이 있습니다. – user2357112배열 함수 매개 변수는 포인터 매개 변수로 조정됩니다. 포인터는 값으로 전달되지만 호출자의 메모리에 액세스하는 데 사용할 수 있습니다. –
@ user2357112 감사합니다. 의견을 답변으로 추가하면 기꺼이 받아 들일 것입니다. – pdoherty926