Теория
На многих машинах - но не на Intel IA32 или их родственниках - если вы хотите получить доступ к 2-байтовому количеству (целому числу), адрес должен быть четным, а не нечётным;если вы хотите получить 4-байтовое количество (целое число или число с плавающей запятой), адрес должен быть кратным 4 байтам;если вы хотите получить доступ к 8-байтовому количеству (целому или двойному), адрес должен быть кратным 8 байтам;и т. д.
Внешне, таким образом, ваш код пытается разыменовать указатель, биты которого установлены в младших разрядах, когда вы этого не должны.Например, одним из способов решения проблемы (в C) будет:
long l = 0x12345678;
void *v = (char *)&l + 1;
long *lp = v;
l = *lp;
К тому времени, как вы пройдете арифметику с указателем, адрес в lp
не будет 4-байтовым (или8 байт) выровнен;это из-за +1
.В последней строке будет указан невыровненный указатель доступа к памяти.
Практика
Поскольку вы не показывали объявления для своего кода, мы не можем быть уверены, что является причиной проблемы (хотя вы и говорите,j
и high
являются int
переменными, без комментариев о low
).Действительно, почти независимо от деклараций кажется маловероятным, что процитированный цикл for
является источником проблемы.Это может быть код, близкий к этому, но, вероятно, это не та строка.
Существует вероятность того, что у вас возникла проблема с перезаписью буфера где-то и вы случайно изменили указатель, и этот измененный указатель сгенерируетошибка.Но, поскольку эта строка, похоже, не содержит каких-либо указателей, вряд ли она будет причиной возникновения проблемы.