C ++ Печать значения указателя дает странный результат - PullRequest
9 голосов
/ 22 июня 2011

Когда я компилирую и запускаю этот код C ++, я не получаю ожидаемый результат.

#include <iostream>
using namespace std;

int main()
{
    int * i = new int;
    long * l = new long;
    char * c = new char[100];
    float * f = new float[100];

    cout << "i " << i << endl;
    cout << "l " << l << endl;
    cout << "c " << c << endl;
    cout << "f " << f << endl;


    delete i;
    delete l;
    delete []c;
    delete []f;

    cin.get();
    return 0;
}

На Unix-машине я получаю

i 0x967f008
l 0x967f018
c
f 0x967f090

На машине с Windows значение для c печатается как строка случайных символов.

Пожалуйста, кто-нибудь может объяснить, почему он неправильно печатает указатель на массив символов.

Спасибо

Ответы [ 4 ]

19 голосов
/ 22 июня 2011

operator << для std::ostream и std::wostream определяется особым образом для указателей символов (char*, const char*, wchar_t* и const wchar_t* для вывода строки с нулевым символом в конце. Это позволяет вамчтобы написать

const char* str = "Hello, World";
std::cout << str;

и увидеть красивую строку в своем stdout.

Чтобы получить значение указателя, приведите к void *

std::cout << static_cast<void*>(c)
4 голосов
/ 22 июня 2011

operator<< перегружен для char*. Он будет считать, что вы пытаетесь напечатать строку в стиле C и распечатать все символы, пока не найдете 0x00. Поскольку вы не инициализируете выделенную память, она выведет случайный мусор.

0 голосов
/ 22 июня 2011

Char * на самом деле является строкой C.Поэтому я предполагаю, что он пытается напечатать его в виде строки.

Один из способов заставить адрес указателя печататься - использовать printf:

printf("%p\n", c);
0 голосов
/ 22 июня 2011

Поскольку в символе, указанном символом c, инициализация отсутствует, вы сбрасываете некоторые случайные значения в памяти, пока не найдете одно со значением 0. Иногда происходит сбой, когда ноль не найден, пока ваша читаемая память не закончит работу. Написание такого кода запрещено и неправильно и в Unix, и в любой другой операционной системе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...