Петля с арифметикой указателя отказывается оставаться в пределах границ в C. Дает мне segfault - PullRequest
0 голосов
/ 24 марта 2010

Привет, я сделал эту функцию, которая сделана, чтобы повторить ошибку, которую я не могу пройти.Это выглядит так:

void enumerate(double *c, int size){
    while(c < &c[size]){
            printf("%lf\n", *c);
            c++;
    }

}

Я добавил туда несколько printf'ов, и это дает мне:

Adressof c: 0x100100080, Adressof c + size: 0x1001000a8

Затем я также печатаю адрес cдля каждой итерации цикла она достигает 0x1001000a8, но продолжается после этой точки, даже если условие должно быть ложным, насколько я могу судить, до тех пор, пока я не получу segfault.Если кто-то может определить проблему, пожалуйста, скажите мне, я уже давно смотрю на это.

Спасибо.

Ответы [ 3 ]

5 голосов
/ 24 марта 2010

Вы используете текущее значение c по обе стороны от условия цикла, и вы увеличиваете c каждую итерацию. c никогда не достигнет адреса самого себя и ничего.

Сохраните адрес c[size], прежде чем войти в цикл, и вы в конечном итоге достигнете его.

void enumerate(double *c, int size) {
    double *addr = &c[size];
    while(c < addr) {
            printf("%lf\n", *c);
            c++;
    }
}
4 голосов
/ 24 марта 2010

Проблема заключается в самой проверке состояния ....

while(c < &c[size])

С помощью цикла while вы увеличиваете c.

Таким образом, c и &c[size] будут продолжать увеличиваться, поскольку второй адрес относительно текущего значения c.

Лучше было бы:

void enumerate(double *c, int size){
    double *ptr = c;
    while(c < &ptr[size]){
            printf("%lf\n", *c);
            c++;
    }
}
0 голосов
/ 24 марта 2010

Каждый раз, когда вы достигаете c++, значение &c[size] также изменяется. Итак, условие всегда выполняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...