C - 指针指向随机值

时间:2017-08-20 11:08:34

标签: c arrays pointers

我对指针很困惑,我不知道为什么会发生这种情况。通常,指向数组的指针只会打印出数组的值,但我不知道为什么会发生这种情况。有人可以解释为什么或建议发生了什么吗?

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的二进制表示,但是打印它会产生随机垃圾。

3 个答案:

答案 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;
}