为什么变量在 C 程序中被改变?
Why is variable being mutated in C program?
在完成 C 编程语言 中的练习 3-5 时,我遇到了以下意外行为。
#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[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
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] = '[=10=]';
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 的新手,但这似乎非常出乎意料。据我了解,函数参数是按值传递的。
您的缓冲区不够大。您为 4 个字符和一个空终止符分配了 space:
char buffer[5] = "0000";
但您正试图用 itob(input, buffer, base);
填充 8 个字符和一个空终止符。这会导致缓冲区溢出和未定义的行为。
尝试使用更大的 buffer
大小,只有 4 个字符不能转换大于 127 的数字。
在完成 C 编程语言 中的练习 3-5 时,我遇到了以下意外行为。
#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[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
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] = '[=10=]';
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 的新手,但这似乎非常出乎意料。据我了解,函数参数是按值传递的。
您的缓冲区不够大。您为 4 个字符和一个空终止符分配了 space:
char buffer[5] = "0000";
但您正试图用 itob(input, buffer, base);
填充 8 个字符和一个空终止符。这会导致缓冲区溢出和未定义的行为。
尝试使用更大的 buffer
大小,只有 4 个字符不能转换大于 127 的数字。