class A {
   public: int i;
};

A *a = new A();

Как узнать адрес a->i? Я пробовал &a->i, а также &(a->i), но они генерируют ошибки времени компиляции:

"слева от '.i' должен иметь тип" класс / структура / объединение "

1
b.roth 29 Июн 2009 в 19:52

6 ответов

Лучший ответ

Вы не предоставили тот же код, который пытались скомпилировать. Всегда копируйте и вставляйте . В вашем коде говорится о том, что у вас нет синтаксически правильного объявления класса или объявления переменной, и что в вашем сообщении об ошибке говорится о ".i", когда вы утверждали, что использовали только a->i. Вот рабочий код:

#include <stdio.h>
class A {
    public:
        int i;
};

int main() {
    A* a = new A();
    int* i = &a->i;
    printf("a: %p\na->i: %p\n", a, i);
    return 0;
}

В конечном итоге синтаксис, который вы говорите пытались получить для получения адреса члена, оказался правильным. В сообщении об ошибке указано, что вы пробовали использовать синтаксис a.i. Это не работает, и по той причине, что было выдано сообщение об ошибке. Переменная a не является типом класса, структуры или объединения. Скорее, это указатель на один из этих типов. Вам нужно разыменовать указатель, чтобы добраться до члена.

Когда запускаю, получаю вот что:

$ ./a.out
a: 40748
a->i: 40748

Адреса такие же, потому что A - простой класс, поэтому этого вывода следовало ожидать. Первый член часто помещается в самое начало памяти класса. Добавьте в класс вторую переменную-член и получите ее адрес; тогда вы должны увидеть разные значения.

8
Rob Kennedy 29 Июн 2009 в 16:08

В с ++:

class A {
    public:         // note colon after public
        int i;
};                  // note semicolon after bracket

A *a = new A();     // note *a not a*

Печатать:

cout << ios::hex << &a->i << endl;

Для меня это работает нормально.

0
stefanB 29 Июн 2009 в 15:58

& a-> я должен работать. В вашем случае, поскольку у класса есть только одно общедоступное целое число, адрес a и i будет одинаковым.

0
msvcyc 29 Июн 2009 в 15:58

Вы на правильном пути, но из-за ошибки компиляции, которую вы упомянули, похоже, что вы набирали "&a.i"

class A 
{
   public: 
       int i;
};

...

A *a = new A();
int *i = &a->i;
0
Corey Ross 29 Июн 2009 в 16:00

Кажется, этот код компилируется?

class A {
   public:
      int i;
};
int main() {
   A *a = new A();
   int *x = &a->i;
   return 0;
}
0
Charles Ma 29 Июн 2009 в 16:00

Следующее работает для меня с использованием g ++

class A
{
public:
    int m_i;
};

int
main()
{
    A* a = new A();
    int* i_ptr = &(a->m_i);

    return 0;
}

Полагаю, вы имеете в виду A* a = ..., а не A a* = ...

0
Beano 29 Июн 2009 в 16:00