【发布时间】:2018-09-26 21:26:56
【问题描述】:
我有以下将十进制转换为二进制的程序:
#include <stdio.h>
#include <string.h>
int main() {
printf("Number (decimal): ");
int no;
scanf("%d", &no);
char bin[64];
while (no > 0) {
for (int i = strlen(bin); i > 0; i--) {
bin[i] = bin[i - 1];
}
int bit = no % 2;
char digit = bit + '0';
bin[0] = digit;
no /= 2;
}
printf("%s", bin);
return 0;
}
程序正常运行,但随机字符串“ttime__vdso_get”被附加到末尾。
每次编译时实现它的数字都不同。
1:1
2:01ttime_vsdo_get
3:10ttime_vsdo_get
当数字变大时,情况会有所不同:
100039:11000011011000111ttime__vdso_getm@
10000000000000000000000000000:ttime
发生了什么?
如果我必须诊断它,我会说我已经设法制作了一个从错误位置提取内存的编译程序。不过,我不知道我是怎么做到的。
如果重要的话,我正在使用 GCC。
【问题讨论】:
-
strlen 不返回 int。
-
bin未初始化。在其上调用strlen的效果是不确定的。 -
@Michi 这不是问题,我已经通过其他方式获得了长度,但它仍在发生。
-
用
char bin[64]="";初始化bin,因为字符串的所有64个字符在程序中都没有改变,最初存储的垃圾值不会改变。因此出现在输出中 -
@JackHasaKeyboard 将从
strlen()返回的值(这是一个size_t值)存储在int中是一个问题,因为它是不好的编码习惯并且应该在编译时生成警告.注意编译器警告。