Как сказать, где я нахожусь в массиве с арифметикой указателя? - PullRequest
4 голосов
/ 05 апреля 2010

В C я объявил область памяти, подобную этой:

int cells = 512;
int* memory = (int*) malloc ((sizeof (int)) * cells);

И я ставлю себя более или менее посередине

int* current_cell = memory + ((cells / 2) * sizeof (int));

Мой вопрос: при увеличении *current_cell как узнать, достиг ли я конца выделенной области памяти?

Ответы [ 4 ]

6 голосов
/ 05 апреля 2010
if (current_cell >= memory + cells)
   no_longer_in_valid_memory;

Тем не менее! У вас большая проблема в вашем коде. Если вы хотите, чтобы current_cell находился где-то в середине области памяти, вы должны сделать это:

int* current_cell = memory + (cells / 2);

Арифметика указателя позаботится о умножении на sizeof (int).

3 голосов
/ 05 апреля 2010

Пока вы находитесь в пределах допустимых индексов, справедливо следующее:

memory <= current_cell && current_cell < memory + cells

, поэтому, если вы увеличиваете адрес, достаточно проверить

current_cell < memory + cells

однако будьте осторожны - вы можете увеличить адрес на такое значение ошибки, что оно переполняется и становится меньше memory. Используйте только второе упрощенное условие, если вы уверены, что переполнение не может произойти.

1 голос
/ 05 апреля 2010

Индекс в массиве, начинающийся с memory, эквивалентный указателю current, равен просто current - memory - за вас позаботится о "масштабировании" (по sizeof(int)). Итак, вы знаете, что указатель действителен (т. Е. В пределах массива cells, начиная с memory), если и только если индекс равен >=0 и <cells (от 0 до 511 включительно, в ваш пример):

((current - memory) >= 0) && ((current - memory) < cells)
1 голос
/ 05 апреля 2010

И я ставлю себя более или менее посередине

int* current_cell = memory + ((cells / 2) * sizeof (int));

На самом деле нет. правильное выражение будет:

int* middle = memory + cells / 2;

, поскольку арифметика указателя учитывает тип указателя. Другими словами, это выражение:

memory + 1

увеличивает указатель не на один байт, а на sizeof(int) байт.

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