Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Я чувствую, что упускаю что-то очевидное, но до сих пор не могу понять это
blockquote>Вы сделали. И это то, с чего вы на самом деле начали: «просто используйте v-версию этих функций» . Причина, по которой эти функции получили v-версию, состояла в том, чтобы позволить, как вы это назвали, соединить их Поэтому, если вы хотите поддержать ее для своей собственной функции, похожей на printf, обязательно следуйте той же практике:
void direct_v(const char * _fmt, bool _extra, va_list args){ char ca[200]; vsprintf(ca, _fmt, args); std::cout << ca << std::endl; } void direct(const char * _fmt, bool _extra...){ va_list args; va_start(args, _extra); direct_v(_fmt, _extra, args); va_end(args); } void chained(const char * _fmt...){ va_list args; va_start(args, _fmt); direct_v(_fmt, false, args); va_end(args); }
Хорошее появляющееся свойство разделения
direct
, подобное тому, что вы получаете лучшее разделение проблемы. Оболочка выполняет связанный битva_list
, а v-функция заботится только о том, что нужно сделать со списком, что позволяет здесь использовать повторно.
Примечание перед редактированием: Кстати, если совместимость с C действительно важна, прототипы функций нуждаются в запятой, чтобы отделить последний аргумент от многоточия. Синтаксис, который вы использовали, - только C ++.
Вы не можете связывать вызовы с переменными функциями в стиле C. Единственный способ - передать va_list
в качестве аргумента. Именно по этой причине необходимо семейство функций v *.
Таким образом, вы пишете свои v * -подобные функции в терминах va_list
, а затем , а затем оборачиваете каждую из них в функцию на основе эллипса.