Подтвердить что ты не робот

Почему только 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

На данный момент меня не интересуют значения, отмеченные на рисунке. Я не разыгрываю их (почему есть такие ошибки выше). Я просто смотрю на окно для этих трех указателей.

4b9b3361

Ответ 1

Для большинства типов указателей в окне "Часы" в Visual Studio отображается значение указателя (адрес, на который он указывает), и вы можете получить доступ к значению "заостренный", расширив значок +. Итак, для нулевого указателя, скажем, int, он просто покажет null или 0x00000000 или что-то в этом роде.

char* обрабатываются по-разному. Здесь "Watch" вообще не отображает значение указателя, но прямо интерпретирует указанные данные как строку NUL -terminated и печатает это. Это, конечно, означает, что null char* не дает значимых результатов, следовательно Bad Ptr.

Другими словами, Watch автоматически выполняет разыменование для char* указателей (и только для них).

Ответ 2

Предположительно, все, что вы используете для отображения значений указателя, также отображает любую строку, на которую указывает указатель char*, поскольку такие указатели иногда используются для указания на строки.

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