2017-01-15 20 views
3

После печати указатель на междунар я печатаю указатель на гольца:C++: Необъяснимое поведение с соиЬ и указатель на символ

#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;?

+1

@iammilind Не дубликат. Я не ожидаю адрес, кроме строки C. Однако, я думаю, вы ответили на мой вопрос: «Стоит отметить, что печать не завершенного NUL c_str - это неопределенное поведение **. Что происходит в вашем случае. Вот почему последовательности cout также имеют значение в вашем компиляторе. или может не иметь такой разницы в моем компиляторе ». Благодаря! –

ответ

2

Бит &q считает, что это нить.

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

+0

Тогда почему я не получаю дополнительный вывод, когда я включаю строку 'cout <<" & i: "<< & i << endl;' заранее? –

+0

Потому что '& i' является целым указателем и обрабатывается по-разному. –

+1

@ Daniel. Стоит отметить, что печать неконвертированного' c_str' - это неопределенное поведение **. Что происходит в вашем случае. Вот почему последовательности 'cout' также влияют на ваш компилятор. Это может или не может иметь такое значение в моем компиляторе. – iammilind