Вы прошли через "переполнение буфера".Краткое определение для этого:
Переполнение буфера происходит, когда программа или процесс пытается записать больше данных в блок памяти или буфер фиксированной длины, чем выделен буфер для хранения.Поскольку буферы создаются для хранения определенного количества данных, дополнительные данные могут перезаписывать значения данных в адресах памяти, смежных с целевым буфером, если программа не включает проверку достаточных границ, чтобы помечать или отбрасывать данные, когда слишком много отправляется в буфер памяти.
Ошибка в вашем коде остается в этом цикле while:
while(temp != 0){
//I added this line to make it clear
printf("inside loop\tarrSize=%d\n",arrSize);
bin[arrSize] = temp % 2;
temp = temp / 2;
arrSize = arrSize - 1;
}
Для входа, равного 300 (ошибка будет возникать для каждого входа> 255), вы получите этовывод:
inside loop arrSize=7
inside loop arrSize=6
inside loop arrSize=5
inside loop arrSize=4
inside loop arrSize=3
inside loop arrSize=2
inside loop arrSize=1
inside loop arrSize=0
inside loop arrSize=-1
inside loop arrSize=0
Проблема в том, что у нас индекс равен -1, Вы спросите, что будет?на самом деле массивы являются указателями на адрес первого элемента таблицы + смещение (индекс * размер типа таблицы), что означает, что для bin [-1] это фактически arrSize, а bin [-2] на самом деле п.Вы можете проверить это, проверив адреса следующим образом:
printf("@ of bin[-1]:\t%p\n",(void*)&bin[-1]);
printf("@ of arrSize:\t%p\n\n",(void*)&arrSize);
printf("@ of bin[-2]:\t%p\n",(void*)&bin[-2]);
printf("@ of n:\t\t\t%p\n",(void*)&n);
, который с моим компилятором дал мне:
@ of bin[-1]: 0x7ffe00e32f9c
@ of arrSize: 0x7ffe00e32f9c
@ of bin[-2]: 0x7ffe00e32f98
@ of n: 0x7ffe00e32f98
Таким образом, вы изменяете, не зная bin [-1] (или bin[-2] в соответствии со значением n), которое на самом деле является arrSize (или n) ..
Как вы можете это исправить?Я советую вам проверять индекс каждый раз, когда вы хотите зациклить массив (условие цикла должно быть в функции arrSize).Или вы можете, если хотите, чтобы этот конкретный пример игнорировал это и сосредоточился на логике: проверьте вход (в вашем случае вход n должен быть: 0 <= n <= 255
)