Если вы ожидаете ошибки сегментации в той или иной ситуации, вы очень часто разочаровываетесь. На это нет никаких гарантий, это было бы слишком просто. Или, иначе говоря, гарантируя, что это будет слишком дорого.
Доступ к массиву за пределами его диапазона вызывает неопределенное поведение, и это означает, что вы гарантированно, что нет гарантии.
https://en.wikipedia.org/wiki/Undefined_behavior
Так что из-за UB угадать, почему что-то в вашем случае происходит, на самом деле неправильно и ничего не объясняет. В некотором смысле запрещено даже догадываться.
Однако, пока вы не полагаетесь на это, вот некоторые догадки, предлагаемые, чтобы минимизировать ваше разочарование.
Способ определения переменных
bool bits[30];
vertex* root = new vertex();
В этом порядке многие компиляторы / компоновщики будут указывать в память указатель * 1017 по адресу, который находится чуть ниже массива bits
.
. местоположение, оно становится жертвой перезаписи, если вы начинаете писать по более низким адресам, чем массив. Что вы делаете здесь
bits[29 - j] = p&1;
, когда j
больше 29. И это очень вероятно, потому что условие l oop не гарантирует остановку до этого.
Кстати даже при сдвиге вправо для некоторых входов в длинную длинную переменную потребуется более 29 сдвигов, чтобы в итоге получилось 0.