Ваша строка не заканчивается нулем. Убедитесь, что вы добавили символ '\0'
в конце строки; или вы можете выделить его с calloc
вместо malloc
, что обнулит память, возвращаемую вам.
Кстати, есть другие проблемы с этим кодом:
- При использовании он выделяет память при вызове, оставляя вызывающего абонента ответственным за
free()
выделенную строку. Вы потеряете память, если просто позвоните в printf
вызове.
- Он делает два прохода над номером, что не нужно. Вы можете сделать все за один цикл.
Вот альтернативная реализация, которую вы можете использовать.
#include <stdlib.h>
#include <limits.h>
char *int2bin(unsigned n, char *buf)
{
#define BITS (sizeof(n) * CHAR_BIT)
static char static_buf[BITS + 1];
int i;
if (buf == NULL)
buf = static_buf;
for (i = BITS - 1; i >= 0; --i) {
buf[i] = (n & 1) ? '1' : '0';
n >>= 1;
}
buf[BITS] = '\0';
return buf;
#undef BITS
}
Использование:
printf("%s\n", int2bin(0xFF00000000, NULL));
Второй параметр - указатель на буфер, в котором вы хотите сохранить результирующую строку. Если у вас нет буфера, вы можете передать NULL
, и int2bin
запишет в буфер static
и вернет это тебе. Преимущество этого по сравнению с оригинальной реализацией заключается в том, что вызывающей стороне не нужно беспокоиться о free()
возвращаемой строке.
Недостатком является то, что существует только один статический буфер, поэтому последующие вызовы будут перезаписывать результаты предыдущих вызовов. Вы не можете сохранить результаты нескольких звонков для дальнейшего использования. Кроме того, это не потокобезопасно, то есть если вы вызываете функцию таким образом из разных потоков, они могут заглушить строки друг друга. Если это возможно, вам нужно будет передать в свой собственный буфер вместо передачи NULL
, например:
char str[33];
int2bin(0xDEADBEEF, str);
puts(str);