我对指针很困惑,我不知道为什么会发生这种情况。通常,指向数组的指针只会打印出数组的值,但我不知道为什么会发生这种情况。有人可以解释为什么或建议发生了什么吗?
char *showBits(int dec, char *buf) {
char array[33];
buf=array;
unsigned int mask=1u<<31;
int count=0;
while (mask>0) {
if ((dec & mask) == 0) {
array[count]='0';
}
else {
array[count]='1';
}
count++;
mask=mask>>1;
}
return buf;
}
期望它返回dec的二进制表示,但是打印它会产生随机垃圾。
答案 0 :(得分:1)
你有
char *showBits(int dec, char *buf);
并期望函数“返回dec的二进制表示”。
假设int
是32位,请执行
#define INT_BITS (32) // to avoid all those magic numbers: 32, 32-1, 32+1
进一步假设函数被调用如下:
int main(void)
{
int i = 42;
char buf[INT_BITS + 1]; // + 1 to be able to store the C-string's '0'-terminator.
printf("%d = 0b%s\n", i, showBits(i, buf));
}
您可以按如下方式更改代码:
char *showBits(int dec, char *buf) {
// char array[INT_BITS + 1]; // drop this, not needed as buf provides all we need
// buf=array; // drop this; see above
unsigned int mask = (1u << (INT_BITS - 1));
size_t count = 0; // size_t is typically used to type indexes
while (mask > 0) {
if ((dec & mask) == 0) {
buf[count] = '0'; // operate on the buffer provided by the caller.
} else {
buf[count] = '1'; // operate on the buffer provided by the caller.
}
count++;
mask >>= 1; // same as: mask = mask >> 1;
}
buf[INT_BITS] = '\0'; // '0'-terminate the char-array to make it a C-string.
return buf;
}
或者,可以像这样使用该函数:
int main(void)
{
...
showBits(i, buf);
printf("%d = 0b%s\n", i, buf);
}
在两种情况下,打印的结果应如下所示:
42 = 0b00000000000000000000000000101010
答案 1 :(得分:1)
问题是您正在返回对本地阵列的引用。相反,让调用者分配缓冲区。我还修复了代码中的其他一些问题:
#define MAX_BUFFER_LENGTH (sizeof(unsigned int) * CHAR_BIT + 1)
char *to_bit_string(unsigned int n, char *buf) {
unsigned int mask = UINT_MAX - (UINT_MAX >> 1);
char *tmp;
for (tmp = buf; mask; mask >>= 1, tmp++) {
*tmp = n & mask ? '1': '0';
}
*tmp = 0;
return buf;
}
首先,我们在这里使用unsigned int而不是signed int,因为当与unsigned int结合使用时,signed int会转换为unsigned int。其次,无符号整数可以有不同的位数;所以我们使用sizeof(unsigned int) * CHAR_BIT + 1
来获得位数的绝对最大值。第三,我们使用UINT_MAX - (UINT_MAX >> 1)
作为获取仅具有最高有效位的值的便捷方式,无论该数字具有多少值位。第四:我们使用移动指针代替索引。第五 - 我们记得将字符串空终止。
用法:
char the_bits[MAX_BUFFER_LENGTH];
puts(to_bit_string(0xDEADBEEF, the_bits));
输出
11011110101011011011111011101111
答案 2 :(得分:0)
一点修改后的代码 - 调用者应该提供buff来容纳字符串
char *showBits(unsigned int dec, char *buf) {
unsigned int mask = 1u << 31;
int count = 0;
while (mask>0) {
if ((dec & mask) == 0) {
buf[count] = '0';
}
else {
buf[count] = '1';
}
count++;
mask = mask >> 1;
}
buf[count] = '\0';
return buf;
}