Доступ к переменному адресу члена-члена структуры - PullRequest
1 голос
/ 24 февраля 2012

У меня есть структура, и я пытаюсь напечатать адрес их переменных-членов.Когда я пытаюсь напечатать адрес переменной-члена char через & (fc), я не получаю их адрес.

Вот код:

struct foo
{
        char c;
        short s;
        void *p;
        int i;
};

int main()
{
        cout << "Size of foo: " << sizeof(foo) << endl;

        foo f;
        cout << "Address of c: " << reinterpret_cast<void*>(&f.c) << endl;
        cout << "Address of c: " << &(f.c) << endl;
        cout << "Address of s: " << reinterpret_cast<void*>(&f.s) << endl;
        cout << "Address of s: " << &(f.s) << endl;
        cout << "Address of p: " << reinterpret_cast<void*>(&f.p) << endl;
        cout << "Address of p: " << &(f.p) << endl;
        cout << "Address of i: " << reinterpret_cast<void*>(&f.i) << endl;
        cout << "Address of i: " << &(f.i) << endl;


        return 1;
}

Вывод

/pp/cplus/bas ]$ ./a.out 
Size of foo: 12
Address of c: 0xffbfe680
Address of c:                   //----------- &(f.c). Why this is empty.. 
Address of s: 0xffbfe682
Address of s: 0xffbfe682
Address of p: 0xffbfe684
Address of p: 0xffbfe684
Address of i: 0xffbfe688
Address of i: 0xffbfe688

просто хочу знать, почему он не печатает, когда я пытался получить к нему доступ через & (fc)

Скомпилировано с использованием gcc версии 3.4.6

Ответы [ 2 ]

9 голосов
/ 24 февраля 2012

cout имеет перегрузку operator<< для char*, которая обрабатывает аргумент как указатель на C-строку и пытается печатать все символы в этой C-строке до тех пор, пока не достигнет NUL (0)байт.Чтобы обойти это поведение, вам нужно привести адреса к void*, как вы делаете каждую другую строку.

Вы только что обнаружили причину, по которой массивы иногда считаются типами данных второго класса, потому что они обрабатываютсяособенно в некоторых ситуациях (то есть массивы char обрабатываются по-разному в некоторых вещах, но не в других).

Address of c: пусто, потому что это то, что вы получаете, когда пытаетесь напечатать строку, на которую указывает &f.c.Как указывал dark_charlie, использование неинициализированной переменной является неопределенным поведением, поэтому технически все может произойти, но первое, вероятно, является объяснением того, что вы видите (хотя мы можем только догадываться).

3 голосов
/ 24 февраля 2012

Причина в том, что без переинтерпретации преобразования & (f.c) указатель char * обрабатывается cout как строка. Поскольку вы не заполнили символ чем-либо, вы вызываете неопределенное поведение (то есть он может печатать что угодно).

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