2015-03-20 3 views
0

Я играл со структурами и указателями, когда наблюдал странное поведение. В следующем коде я создал структуру, содержащую: id, last_name_inital, full_name и first_name_inital. Глядя на адреса памяти int и строки, отлично работает, но при просмотре символов получается сломанный вывод. Я добавил к символам вне структуры, которые показывают одинаковое поведение. Глядя только на вывод символа, и его вывод указателя возвращает тот же символ, что и адрес.Поведение странного указателя с символами

#include <iostream> 
#include <string> 
using namespace std; 

struct entry 
{ 
    int id = 1; 
    char last_name_inital = 'S'; 
    string full_name = "August Smith"; 
    char first_name_inital = 'A'; 
}; 

int main() 
{ 
    entry aug; 
    entry *p_aug = &aug; 

    char alpha ='A'; 
    char *p_alpha = &alpha; 

    char sirra ='S'; 
    char *p_sirra = &sirra; 

    cout << "Printing structure address" << endl; 
    cout << p_aug << endl; 
    cout << "\n"; 

    cout << "Printing id and it's address" << endl; 
    cout << p_aug->id << " " << aug.id << endl; 
    cout << &p_aug->id << " " << &aug.id << endl; 
    cout << "\n"; 

    cout << "Printing last_name_inital and it's address" << endl; 
    cout << p_aug->last_name_inital <<" "<< aug.last_name_inital << endl; 
    cout <<&p_aug->last_name_inital<<" "<< &aug.last_name_inital << endl; 
    cout << "\n"; 

    cout << "Printing full_name and it's address" << endl; 
    cout << p_aug->full_name << " " << aug.full_name << endl; 
    cout << &p_aug->full_name << " " << &aug.full_name << endl; 
    cout << "\n"; 

    cout << "Printing first_name_inital and it's address" << endl; 
    cout << p_aug->first_name_inital <<" "<<aug.first_name_inital<< endl; 
    cout <<&p_aug->first_name_inital<<" "<<&aug.first_name_inital<< endl; 
    cout << "\n"; 

    cout << "Printing alpha and it's address" << endl; 
    cout << *p_alpha << " " << alpha << endl; 
    cout << p_alpha << " " << &alpha << endl; 
    cout << "\n"; 

    cout << "Printing sirra and it's address" << endl; 
    cout << *p_sirra << " " << sirra << endl; 
    cout << p_sirra << " " << &sirra << endl; 
    cout << "\n"; 


} 

, который дает следующий результат (составитель и написана с Geany, г ++, Linux):

структура печати адрес

0x7fff01772360

Печать идентификатора и его адрес

0x7fff01772360 0x7fff01772360

Печать full_name и его адрес

S S

S S

Печать last_name_inital и его адрес

августа Смит августа Смит

0x7fff01772368 0x7fff01772368

Печать last_name_inital и его адрес

AA

A @ A @

Печать альфа и его адрес

А.А.

AS #w� AS #W

Печать альфа и его адрес

S S

S #w� S #W

на каждом запуске последние изменения выходных, так что, очевидно, что-то меняется. Он-лайн поиск дал только этот вопрос, который касается одного и того же фона, но на самом деле, или я его не понимаю. character pointers in C++

В основном, мои основные вопросы - это то, что происходит там, и можно ли выводить указатель на символ, поэтому, где он хранится?

Спасибо


EDIT:

Быстрые ответы решить вопрос о том, как распечатать указатель адреса полукокса. При использовании: (void*)(&char_name)

Однако мне не интересно, почему значения обычных символов изменяются, но значения символов внутри структуры остаются неизменными при повторном запуске. Особенно потому, что поведение для char 'S' в структуре с cout является упомянутым оператором-overloaded-just-give-back-the-char, но не для 'A', а также не для обычных символов вне структуры.

Может ли кто-нибудь объяснить эти различия? Или даже это не происходит для вас?

+0

Вы не определяете sirra и p_sirra, а в цитируемой выходной строке завершается упаковка, а текст не соответствует коду. Пожалуйста, будьте внимательны при цитировании. –

+0

@LorenzoGatti отредактировал – Marius

+0

Если вы еще раз играли с символами. Из структур, классов и нормалей и вывода '& a_char' с очень своеобразным, неожиданным выходом. Кажется, он считывает все персонажи, которые он находит, даже после первоначального, и даже если они больше не являются символами, что создает странный результат. Любое объяснение приветствуется. – Marius

ответ

3

Вы можете наложить char * на номер void *. Проблема в том, что operator<< перегружен, чтобы читать char * как c_string.

cout << "Printing last_name_inital and it's address" << endl; 
cout << p_aug->last_name_inital <<" "<< aug.last_name_inital << endl; 
cout << (void*)(&p_aug->last_name_inital) <<" "<< (void*)(&aug.last_name_inital) << endl; 
cout << "\n"; 
+0

Не могли бы вы привести пример кода для символа 'char example = 'A'', как я могу теперь просмотреть, где он сохранен, поэтому это указатель – Marius

+0

' cout << "example содержит" << example << endl; cout << "адрес примера:« << (void *) (& gt;) << endl; ' – jhnnslschnr

+0

, пожалуйста, укажите ваш пример кода в ответе, поэтому его легче найти для других людей, рассматривающих вопрос – Marius

0

ostream& operator<< (ostream& os, const char* s);, чтобы написать последовательность char не обратиться, чтобы бросить void*, чтобы получить адрес.

0

Как правило, адреса различаются между выполнением программы, так как операционная система имеет разные доступные ячейки памяти или намеренно перемещается по данным из соображений безопасности.

Проверка значений указателя полезна только для сравнения указателей в одном экземпляре программы: например, p_aug и &aug имеют одинаковое значение.

+0

Ваша первая часть ясно и имеет смысл, мне просто интересно, потому что это не настоящий адрес. Вопрос, который у меня есть из второй части: так что p_aug или & aug хранят значение hex для местоположения, а 'cout <<' просто не способ его распечатать? – Marius