const char *byte_to_binary(int x)
{
static char b[9];
...
return b;
}
Эта функция не реентерабельна и возвращает указатель на локальное значение.Таким образом, используя его следующим образом: byte_to_binary(ch), byte_to_binary(ch & a)
даст один и тот же результат дважды, так как значение указателя одинаково (!).
Но вы можете передать выделенное пространство своей функции:
const char *byte_to_binary(int x, char b[9]) {
...
return b;
}
И вызов с использованием константного литерала:
byte_to_binary(ch, (char[9]){0}), byte_to_binary(ch & a, (char[9]){0}),
Это выделит необходимые 9 символов для каждого вызова функции.Вы можете сделать это макросом:
const char *byte_to_binary_in(int x, char b[9]) {
...
return b;
}
#define byte_to_binary(x) byte_to_binary_in(x, (char[9]){0})
И остаться с тем же интерфейсом, в то время как ваша функция остается реентерабельной.
Однако имейте в виду, что составные литералы перестают существовать при выходе изблок, т.е.после }
.
PS Развлекайся и посмотри мои маленькие функции printbinary
и макрос PRINTBINARY_t(...)
, header и src .Тем не менее, в сети есть решение для печати двоичных чисел.