Это не очень хорошая политика принять произвольные указатели как входные параметры в общедоступном API. Лучше иметь "простые данные" типы как целое число, строка или структура (я имею в виду классическую структуру с простыми данными внутри, конечно; официально что-либо может быть структурой).
, Почему? Хорошо, потому что, поскольку другие говорят, что нет никакого стандартного способа знать, были ли Вы даны допустимая подсказка или та, которая указывает на спам.
, Но иногда у Вас нет выбора - Ваш API должен принять указатель.
В этих случаях, это - обязанность вызывающей стороны передать хороший указатель. ПУСТОЙ УКАЗАТЕЛЬ может быть принят как значение, но не указатель на спам.
можно ли перепроверить всегда? Ну, что я сделал в случае как этот, должен был определить инвариант для типа, на который указывает указатель, и назовите его, когда Вы получаете его (в режиме отладки). По крайней мере, если инвариант перестал работать (или катастрофические отказы), Вы знаете, что были переданы плохое значение.
// API that does not allow NULL
void PublicApiFunction1(Person* in_person)
{
assert(in_person != NULL);
assert(in_person->Invariant());
// Actual code...
}
// API that allows NULL
void PublicApiFunction2(Person* in_person)
{
assert(in_person == NULL || in_person->Invariant());
// Actual code (must keep in mind that in_person may be NULL)
}