Печать адреса объекта структуры - PullRequest
4 голосов
/ 14 июня 2010

У меня есть struct, как это

typedef struct _somestruct {
    int a;
    int b;
}SOMESTRUCT,*LPSOMESTRUCT;

Я создаю объект для struct и пытаюсь напечатать его адрес следующим образом

int main()
{
    LPSOMESTRUCT val = (LPSOMESTRUCT)malloc(sizeof(SOMESTRUCT));

    printf("0%x\n", val);

    return 0;
}

.. и я получаю это предупреждение

предупреждение C4313: «printf»: «% x» в строка формата конфликтует с аргументом 1 типа 'LPSOMESTRUCT'

Итак, я попытался привести адрес к int, как это

printf("0%x\n", static_cast<int>(val));

Но я получаю эту ошибку:

ошибка C2440: «static_cast»: невозможно конвертировать из 'LPSOMESTRUCT' в 'int'

Что мне здесь не хватает? Как избежать этого предупреждения?

Спасибо.

Ответы [ 4 ]

12 голосов
/ 14 июня 2010

%x ожидает без знака.То, что вы печатаете, является указателем.Чтобы сделать это правильно, вы обычно хотите использовать %p.Чтобы быть педантично правильным, он ожидает указатель на void, поэтому вам нужно привести его:

printf("%p\n", (void *)val);

В действительности большинство современных реализаций используют один и тот же формат для всех указателей, и в этом случае приведение будетбыть пустымКонечно, учитывая тег C ++, большая часть кода, который вы включили, становится в лучшем случае сомнительной (кроме таких частей, как LPSOMESTRUCT, которые сомнительны независимо).В C ++ обычно требуется что-то более похожее на:

struct somestruct { 
   int a;
   int b;
};

somestruct *val = new somestruct; // even this is questionable.

std::cout << val;
2 голосов
/ 14 июня 2010

Используйте спецификатор формата% p для печати указателя.

printf("%p\n", val);
1 голос
/ 14 июня 2010

Поскольку это тег C ++, могу ли я просто указать, что вам не нужны typedef для создания структур на этом языке:

typedef struct _somestruct {
    int a;
    int b;
}SOMESTRUCT,*LPSOMESTRUCT;

должно быть:

struct SOMESTRUCT {
    int a;
    int b;
};

Кроме того,многие считают плохой практикой создавать определения типов, такие как LPSOMESTRUCT, которые скрывают тот факт, что тип является указателем.

1 голос
/ 14 июня 2010

Если вы хотите выполнить приведение, то здесь можно использовать reinterpret_cast вместо static_cast.

С printf попробуйте использовать% zu вместо% x для печати указателя, поскольку указатель имеет целочисленный тип без знака(т.е.% zu).

printf("%zu \n", val);

Еще одна вещь, будучи программой на С ++, есть ли причина, по которой вы используете malloc вместо new?

...