Значення нульового вказівника являє собою чітко визначене "ніде"; це недійсне значення вказівника, яке гарантується порівнянням нерівним з будь-яким іншим значенням вказівника. Спроба перенаправити нульовий вказівник призводить до невизначеної поведінки, і, як правило, призведе до помилки виконання, тому ви хочете переконатися, що покажчик не є NULL, перш ніж намагатися його знеструмити. Ряд функцій бібліотеки C і C ++ поверне нульовий покажчик, що вказує на стан помилки. Наприклад, функція бібліотеки malloc
поверне нульове значення вказівника, якщо вона не може виділити кількість байтів, які були запитувані, а спроба доступу до пам'яті через цей покажчик (як правило) призведе до помилки виконання:
int *p = malloc(sizeof *p * N);
p[0] = ...; // this will (usually) blow up if malloc returned NULL
Тому нам потрібно переконатися, що malloc
виклик вдався, перевіривши значення p
на NULL:
int *p = malloc(sizeof *p * N);
if (p != NULL) // or just if (p)
p[0] = ...;
Тепер, покладись на шкарпетки хвилину, це стане трохи кумедним.
Існує значення нульового вказівника та константа нульового вказівника , і обидві не обов'язково однакові. Покажчик нульовий значення є будь-яке значення , що лежать в основі використання архітектури не уявляють «ніде». Це значення може бути 0x00000000, або 0xFFFFFFFF, або 0xDEADBEEF, або щось зовсім інше. Не думайте , що покажчик нульового значення завжди 0.
Константа нульового покажчика , OTOH, завжди є 0 -значним інтегральним виразом. Що стосується вашого вихідного коду , 0 (або будь-який інтегральний вираз, який оцінює до 0), являє собою нульовий покажчик. І C, і C ++ визначають макрос NULL як константа нульового покажчика. Коли ваш код складений, константа нульового вказівника буде замінена на відповідне значення нульового вказівника у створеному машинному коді.
Також пам’ятайте, що NULL - лише одне з багатьох можливих недійсних значень вказівника; якщо ви оголосили змінну автоматичного вказівника без явної ініціалізації, наприклад,
int *p;
значення, яке спочатку зберігається у змінній, є невизначеним і може не відповідати дійсній чи доступній адресі пам'яті. На жаль, не існує жодного (портативного) способу визначити, чи не вказано значення NULL вказівника чи ні перед спробою його використання. Отже, якщо ви маєте справу з покажчиками, зазвичай корисно явно ініціалізувати їх на NULL, коли ви їх оголошуєте, і встановити їх на NULL, коли вони активно не вказують ні на що.
Зауважте, що це більше проблема C, ніж C ++; ідіоматичний C ++ не повинен так активно використовувати покажчики.