C Изменение массива, вызывающее изменение переменной

StackOverflow https://stackoverflow.com/questions/4309546

  •  29-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь изменить значение в массиве с помощью языка программирования C, и, похоже, я упираюсь в глухую стену с помощью этой, казалось бы, простой операции.См. фрагмент кода ниже:

while(1) {
        printf("Current prime candidate is %i\n",nextPrimeCandidate);
        int innerSieve;//=2;
        int currentPrimeCandidate=0;

        for (innerSieve=2;innerSieve<SIEVELIMIT;innerSieve++) {
            currentPrimeCandidate = nextPrimeCandidate * innerSieve;
            //printf("Inner Sieve  is b4 funny place %i,%i\n",innerSieve,currentPrimeCandidate);

            //initArray[currentPrimeCandidate]=5;
            //VERY UNIQUE LINE
            myArray[currentPrimeCandidate] = 0;



            //printf("Inner Sieve after funny place is %i,%i \n",innerSieve,currentPrimeCandidate);

        }
        nextPrimeCandidate=getNextPrimeCandidate(myArray,++nextPrimeCandidate);
        if ((nextPrimeCandidate^2) > SIEVELIMIT ) break;

    }

Проблема в строке, выделенной значком VERY UNIQUE LINE комментарий.По какой-то причине, когда переменная InnerSieve достигает 33 и попадает в эту строку, она устанавливает для содержимого переменной InnerSieve значение этой строки (которое в настоящее время равно 0) и фактически переводит цикл в бесконечный цикл ( SIEVELIMIT переменная установлена ​​на 50).Кажется, что в регистрах происходит что-то забавное, когда я проверял с помощью средства отладки Eclipse, но я не совсем уверен, что мне следует искать.

Если вам нужен весь листинг кода, его можно предоставить (с определенной переменной, которая еще не инициализирована в инициализируемом коде именно в тот момент, когда переменная InnerSieve достигает 32).

Любая помощь будет оценена.

Это было полезно?

Решение

Предполагая, что currentPrimeCandidate превышает максимальный показатель myArray, и ты перезаписываешь innerSieve (что, вероятно, следует myArray в стеке).

Другие советы

@ruslik отметил это в комментарии.Проблема в этой строке:

if ((nextPrimeCandidate^2) > SIEVELIMIT ) break;

В С, ^ оператор нет энергетический оператор, это побитовое ИЛИ оператор.Вы выполняете итерацию слишком много раз, чем предполагали, что приводит к ошибке выхода за пределы индекса массива, поэтому вы перезаписываете случайную память и получаете странные результаты.

В C нет степенного оператора (хотя есть pow функция).Поскольку вы просто возводите число в квадрат, самое простое решение — умножить число само на себя:

if ((nextPrimeCandidate * nextPrimeCandidate) > SIEVELIMIT ) break;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top