Как проверить, находится ли указатель внутри массива?
Код может использовать >=, >, <, <=
между двумя указателями объекта 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");
}
лучший подход в "Как проверить, есть ли указатель внутри массива? это реформировать проблему. ОП не опубликовал , почему этот тест необходим. Хороший код обычно может решить проблему и не использовать этот тест.