2010-04-05 16 views
4

В C, я объявил область памяти, как это:Как определить, где я находится в массиве с арифметикой указателя?

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

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

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

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

ответ

6
if (current_cell >= memory + cells) 
    no_longer_in_valid_memory; 

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

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

Указатель арифметика будет заботиться о умножении на SizeOf (INT).

3

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

memory <= current_cell && current_cell < memory + cells 

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

current_cell < memory + cells 

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

+0

Вы уверены, что это не ячейки * sizeof int? это было моим сомнением. –

+1

@klez: Конечно нет '* sizeof()'. При указании 'type *' pointer '(type + N)' указывает на N-й элемент - компилятор выполнит умножение '* sizeof (Type). – sharptooth

+0

Это не так. Когда вы используете + или - с указателем и интегральным типом, он добавляет или вычитает * элементы *, а не байты. –

1

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

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

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

int* middle = memory + cells/2; 

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

memory + 1 

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

1

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

((current - memory) >= 0) && ((current - memory) < cells) 
Смежные вопросы