C++: необъяснимое поведение с cout и указателем на char

После печати указателя на int я печатаю указатель на char:

#include <iostream>

using namespace std;

int main() {

    int i;
    cout << "&i: " << &i << endl;

    char q = 'q';
    cout << "&q: " << &q << endl;

    return 0;

}

Я получаю следующий вывод, как и ожидалось:

&i: 0xffffcc0c
&q: q

Однако, если я закомментирую cout << "&i: " << &i << endl; и снова запущу программу, я получу следующий необъяснимый вывод:

&q: q����

Кто-нибудь знает, почему это происходит?

Если это связано с вставкой operator<< в поток до тех пор, пока не будет найден нулевой символ, то почему я получаю ожидаемый результат, когда включаю cout << "&i: " << &i << endl;?

ПРИМЕЧАНИЕ: я не ожидаю получить адрес q от cout. Я ожидаю получить строку C, на которую указывает &q. Что меня беспокоит, так это то, что вывод просто печатает «q», если я заранее включаю строку cout << "&i: " << &i << endl;. Однако, если я закомментирую эту строку, на выходе будут данные мусора. Почему в моем выводе нет мусорных данных, когда я включаю строку cout << "&i: " << &i << endl;?


person Daniel Gilbert    schedule 15.01.2017    source источник
comment
@iammilind Не дубликат. Я не ожидаю адреса, а строку C. Тем не менее, я думаю, вы ответили на мой вопрос: стоит отметить, что печать c_str без завершения NUL является неопределенным поведением. Что и происходит в вашем случае. Вот почему последовательности cout также имеют значение в вашем компиляторе. Это может или не может иметь такое значение в моем компиляторе. Спасибо!   -  person Daniel Gilbert    schedule 15.01.2017


Ответы (1)


Бит &q считает, что это строка.

Поэтому будет печатать до нулевого символа. следовательно, дополнительный выход

person Ed Heal    schedule 15.01.2017
comment
Тогда почему я не получаю дополнительный вывод, когда заранее включаю строку cout << "&i: " << &i << endl;? - person Daniel Gilbert; 15.01.2017
comment
Потому что &i - это целочисленный указатель, и он обрабатывается по-разному. - person Ed Heal; 15.01.2017
comment
@Daniel Стоит отметить, что печать c_str без завершения NUL является неопределенным поведением. Что и происходит в вашем случае. Вот почему последовательности cout также имеют значение в вашем компиляторе. Это может или не может иметь такое значение в моем компиляторе. - person iammilind; 15.01.2017
comment
@DanielGilbert, если вы имеете в виду, что вывод &q изменяется в зависимости от присутствия другой строки, это потому, что печать строки, начинающейся с &q, выходит за пределы одного символа вашей памяти, что является неопределенным поведением. Вы не можете безопасно полагаться на какое-либо конкретное поведение. - person chris; 15.01.2017
comment
@iammilind - std::string не участвует - строки C (или их отсутствие) - person Ed Heal; 15.01.2017