Как вывести значение параметра, если тип не известен в C? - PullRequest
2 голосов
/ 16 октября 2010

Как мне узнать, что содержит конкретный адрес, указанный моим указателем?Я хочу напечатать содержимое в этом месте адреса?Что я должен добавить в качестве заполнителя?

Ответы [ 5 ]

3 голосов
/ 16 октября 2010

Нет способа обнаружить это в C. Ваше приложение должно обрабатывать данные, на которые указывает указатель на определенный тип - зависит от ваших потребностей.

void treat_as_char(const void* ptr)
{
    const char *p = ptr;
    printf("Data: %s\n", p);
}

void treat_as_int(const void* ptr)
{
    const int *p = ptr;
    printf("Data (int): %d\n", p);
}

Вам нужна некоторая пользовательская структура, чтобы разрешить различный тип для определенного указателя:

typedef struct _Variant
{
    enum {INT, CHAR, DOUBLE} type;
    void *ptr;
} Variant;
3 голосов
/ 16 октября 2010

Если ваш вопрос - как вы можете определить тип объекта, хранящегося в данном месте, обозначенном void*, то вы не можете.Если ваш вопрос заключается в том, как я могу узнать значение байта, на который указывает мой void*, то это

unsigned char valueAtAddressP = *((unsigned char*)p);
2 голосов
/ 16 октября 2010

Еще один способ сделать это - обратиться к своим данным как void*, а затем - к unsigned char* и распечатать все как шестнадцатеричные байты. Я обнаружил, что это действительно полезно, когда приходится иметь дело с смежными байтами, где их использование еще не известно.

Однако этот метод требует, чтобы у вас был способ узнать, как долго ваши данные, поскольку нет способа вызвать sizeof для данных произвольного типа.

#include <stdio.h>

int main() {
    char name[16] = "hello there";
    void* voidBuffer = name;

    unsigned char* buffer = voidBuffer;
    int i;
    for (i=0; i<16; i++) {
        printf("%x ", (unsigned int)buffer[i]);
    }

    return 0;
}

Это выдаст 68 65 6c 6c 6f 20 74 68 65 72 65 0 0 0 0 0.

2 голосов
/ 16 октября 2010

Любой другой тип указателя может быть приведен к пустому указателю для печати его адреса:

char c='A';
char *pc=&c;

printf("%p",(void *) pc);

Теперь, если вам нужен персонаж по этому адресу:

char c='A';
char *pc=&c;

printf("%c",*pc);
1 голос
/ 16 октября 2010

Вы можете сделать это несколькими способами

int x = 5;
int *ptrX = 6;
printf("The pointer of x is: %d", &x);
printf("The ptrX is: %d", ptrX);

Оба вышеуказанных подхода дают вам значение адреса.

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