Если вы немного измените свой код
for(int j = 0; j < size; j++){
printf("%c 0x%02x\n", binary[j], binary[j]); // but this works(2)
}
, вы увидите ведущий '\0'
в своем результате:
With function: 1decToBinary =
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
1 0x31
0 0x30
0 0x30
0 0x30
0 0x30
0 0x30
0 0x30
0 0x30
0 0x30
1 0x31
1 0x31
0x00
Так что в вашей функции что-то не так decToBinary
.
Вы считаете с i
от конца массива, поэтому в зависимости от ввода вы можете не достичь начала массива.
Вы можете попробовать return binary+i+1;
вконец decToBinary
.Это вернет указатель на символ, который вы написали последним.Обратите внимание, что вам не следует перебирать size
символов результата, но только до '\0
.
Это не окончательное решение, поскольку вы используете malloc
для выделения массива символов в decToBinary
,Это означает, что вы должны вернуть указатель, полученный из malloc
, и вызвать free
в вызывающей функции.
Для этого вы можете использовать дополнительный цикл, который копирует все символы из индекса i+1
до'\0'
к началу массива.
for(i++, j=0; binary[i]; i++, j++) {
binary[j] = binary[i];
}
binary[j] = '\0';
/* ... */
return binary;
Дополнительное примечание:
Подобный код создает утечку памяти, поскольку вы не free
получаете результаты повторных вызовов decToBinary
:
for(int i = 0; i < size; i++){
printf("With function: %c", decToBinary(n, size)[i]);
}