Почему только char * - это <Bad Ptr>, а не другие типы данных?
Я изучаю указатели в С++. При инициализации указателей, например,
double* pvalue1 = nullptr;//okay
char* pvalue2 = nullptr; //only this says, "0x00000000 <Bad Ptr>" (in the watch window of Visual C++ 2010)
int* pvalue3 = nullptr; //okay
Почему только указатель типа char
дает Bad Ptr, а другие типы указателей нет?
![enter image description here]()
На данный момент меня не интересуют значения, отмеченные на рисунке. Я не разыгрываю их (почему есть такие ошибки выше). Я просто смотрю на окно для этих трех указателей.
Ответы
Ответ 1
Для большинства типов указателей в окне "Часы" в Visual Studio отображается значение указателя (адрес, на который он указывает), и вы можете получить доступ к значению "заостренный", расширив значок +. Итак, для нулевого указателя, скажем, int
, он просто покажет null
или 0x00000000
или что-то в этом роде.
char*
обрабатываются по-разному. Здесь "Watch" вообще не отображает значение указателя, но прямо интерпретирует указанные данные как строку NUL
-terminated и печатает это. Это, конечно, означает, что null char*
не дает значимых результатов, следовательно Bad Ptr
.
Другими словами, Watch автоматически выполняет разыменование для char*
указателей (и только для них).
Ответ 2
Предположительно, все, что вы используете для отображения значений указателя, также отображает любую строку, на которую указывает указатель char*
, поскольку такие указатели иногда используются для указания на строки.
В этом случае, будучи нулевым, он не указывает на какую-либо строку, поэтому все, что отображается, указывает на это.