Как проверить, если указатель внутри массива? - PullRequest
3 голосов
/ 07 апреля 2020

Я хотел бы проверить, если myCurrentPtr указывает внутри моего массива a.

_B представляет количество значений в a.
Итак, a + _B должен указывать последнее значение массива.

#define _B ((uint8_t)5)
volatile uint8_t a[5] = {0, 1, 2, 3, 4}; //`a` is a pointer to the first array element

if (myCurrentPtr > (a + _B)) {
    printf("Out of bounds!");
}

Не компилируется. Есть ли у вас какие-либо идеи?

Принимая во внимание, что

...
if (myCurrentPtr > (a + 5)) {
    printf("Out of bounds!");
}

компилируется просто отлично.

Разве они не совпадают после предварительной обработки?

1 Ответ

2 голосов
/ 07 апреля 2020

Как проверить, находится ли указатель внутри массива?

Код может использовать >=, >, <, <= между двумя указателями объекта p,q, если они находятся в одном массиве (или только один передал конец массива). Остальной код неопределенное поведение . C не имеет переносимого способа тестирования в / вне массива.

Код ниже:

if (myCurrentPtr == (a + _B)) {                            // Defined behavior
  printf("pointer just passed a[]\n"); 
} else if (myCurrentPtr >= a && myCurrentPtr < (a + _B)) { // Undefined behavior
  printf("pointer in array\n");        
} else {
  printf("pointer outside array\n");
}

Код может явно сравнивать по одному с ==, != с myCurrentPtr и каждый элемент a[]. Вероятно, это неудовлетворительно медленно, но надежно.

// Dependable, well defined, but slow.
found = false;
for (int i=0; i<5; i++) {
  if (myCurrentPtr == &a[i]) {
    found = true;
    break;
  }
}

Другие подходы основаны на ненадежном коде.

// Iffy code - depending on memory model, may work, may not.
uintptr_t mcp = (uintptr_t) myCurrentPtr;
uintptr_t ia =  (uintptr_t) a;
uintptr_t ia5 = (uintptr_t) &a[5];

if (mcp >= ia && mcp < ia5) {         // Not highly portable
  printf("pointer in array\n");        
} else {
  printf("pointer just passed a[]\n");
}

лучший подход в "Как проверить, есть ли указатель внутри массива? это реформировать проблему. ОП не опубликовал , почему этот тест необходим. Хороший код обычно может решить проблему и не использовать этот тест.

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