Проблема заключается в следующих нескольких строках:
for (i = 0; n>0; i++)
{
ptr = realloc(ptr, i * sizeof(int));
ptr[i] = n % 2;
n = n/2;
}
Вы перераспределяете массив, каждый раз содержащий i
целых чисел, однако в итоге вы пишете по индексу i
. Массив, содержащий i
целых чисел, имеет индексы от 0
до i - 1
, и поэтому вы пишете после конца массива. Это приводит к неопределенному поведению .
Самое простое решение для этого - просто начать с i = 1
и записать в ptr[i - 1]
:
for (i = 1; n > 0; i++)
{
ptr = realloc(ptr, i * sizeof(int));
ptr[i - 1] = n % 2;
n = n/2;
}
Более простой подход - использовать массив фиксированного размера. Вы уже знаете, что длина int
составляет 8*sizeof(int)
бит, так что это максимум, что вам нужно. Кроме того, вам, вероятно, не нужно работать со знаковыми целыми числами, поскольку они могут вызвать проблемы с отрицательными значениями (поэтому вы можете использовать unsigned
).
РЕДАКТИРОВАТЬ: я говорю 8 * sizeof(int)
, потому что Оператор sizeof
возвращает размер типа (в данном случае int
) в байтах. Байт составляет 8 бит, поэтому я умножил его на 8, чтобы получить размер в битах. Я сказал 8
здесь, но использование CHAR_BIT
(из limits.h
) было бы лучше, потому что "байт" в C мог бы быть выражен с использованием более 8 бит, и в этом случае CHAR_BIT
содержит правильное количество бит на байт. Мне неизвестно о реализации C, значение которой отличается от 8
для CHAR_BIT
, но, тем не менее, это правильный путь к go. Я обновил код ниже, чтобы использовать CHAR_BIT
вместо 8
.
#include <stdio.h>
#include <limits.h>
#define N_BITS CHAR_BIT * sizeof(unsigned)
int main(void) {
unsigned digits[N_BITS] = {0}; // Start with an array filled with zeroes.
unsigned n;
int i;
printf("Enter a number to convert: ");
scanf("%u", &n);
// Calculate binary digits.
for (i = 0; n > 0; i++) {
digits[i] = n % 2;
n /= 2;
}
// Skip leading zeroes.
while (digits[i] == 0)
i--;
// Print binary digits in reverse order.
for(; i >= 0; i--)
printf("%u", digits[i]);
// Final newline.
putchar('\n');
return 0;
}
Бонус:
#include <stdio.h>
int main(void) {
int i = 8 * sizeof(unsigned);
unsigned n;
printf("Enter a number to convert: ");
scanf("%u", &n);
while (i--)
putchar('0' + ((n >> i) & 1));
putchar('\n');
return 0;
}