Почему я должен делать нулевую проверку в C ++? - PullRequest
0 голосов
/ 29 апреля 2020

Я хочу знать необходимость проверки нуля.

Пример кода следующий

#include <iostream>
bool twice( int* a )
{
    if( a == nullptr )
    {
        std::cout << "null" << std::endl;
        return true;
    }
    std::cout << *a << std::endl;
    *a *= 2;
    std::cout << *a << std::endl;
    return false;
}
int main()
{
    twice( nullptr );
    int v = 16;
    std::cout << v << std::endl;
    twice( &v );
    std::cout << v << std::endl;
}

Это вывод

null
16
16
32
32

Я распознаю, что 'nullptr' «указатель, указывающий ноль адреса памяти» или «флаг, когда ссылка на указатель переменной недействительна».


Q1. адрес ноль памяти только один на реальную память?

Q2. Можете ли вы воспроизвести в этом коде «ссылка на переменную указателя недействительна»?

Q3. Какой тип функции делает ссылку на переменную указателя недействительной?

Извините, мой бедный Энгли sh.

Ответы [ 2 ]

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

Я бы рекомендовал подумать об этом по-другому. Вместо того, чтобы думать о нулевом указателе как о «нулевом адресе памяти», думайте о нем как «этот указатель фактически ни на что не указывает».

С этой ментальной моделью, есть более ясная причина, почему вам нужна проверка на ноль. Если у вас есть указатель, который на самом деле ни на что не указывает, то запись

*a  *=  2;

является бессмысленной операцией - нет ничего, на что указывает указатель a, поэтому разыменуйте a, чтобы получить integer, а затем удвоение этого целого числа не является четко определенной операцией.

Внутренне, в большинстве систем, yes nullptr реализован как «указатель на нулевой адрес памяти, который считается недействительным в большинстве операционных систем. , "но я не думаю, что это проливает свет на то, почему этот код нуждается в нулевой проверке.

0 голосов
/ 29 апреля 2020

Указатель - это просто целое число без знака, которое указывает на адрес памяти. В некоторой системе, имеющей виртуальную память, первая страница памяти не будет отображаться на физическую память. Поэтому, когда мы пытаемся читать / писать по адресу с нулевым указателем, это вызывает ошибку сегментации / ошибку страницы. Однако в некоторых встроенных устройствах мы не будем наблюдать проблему сбоя сегментации, поскольку мы могли бы получить доступ к нулевому пространству памяти

Независимо от ОС, чтобы избежать приложения cra sh, добавление проверки нулевого указателя является хорошей практикой

...