Как привести C void* указатель на указатель на структуру (с определением структуры как строки)?

Я хотел бы распечатать информацию, хранящуюся в памяти, указанной void* указатель.

Но информация о типе недоступна при типе компиляции.

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

Я думаю, что это должно быть возможно, так как отладчик может получить доступ к необработанным указателям в отлаживаемом процессе и использовать отладочную информацию (скажем, в формате DWARF), прикрепленную к исполняемому файлу, для печати информации, читаемой человеком. Я просто не знаю, как это делается в коде.

Кто-нибудь может дать мне знать, кто это делает? Благодарю.

РЕДАКТИРОВАТЬ. Вот что я хочу сделать в коде.

//definition
void myprint(void *p, const char *struct_def) {
//print the content in p according to struct_def, struct_def can be any valid struct definition in C.
}

//call
myprint(p, "struct s { int n; double d[10]; }");
}

РЕДАКТИРОВАТЬ: определение структуры может не иметь C, это может быть в другом пользовательском формате, например, LLVM IR или drawf.

1 ответ

Чтобы показать вам, как интерпретировать здесь, у вас есть небольшой фрагмент. Это массив символов, сформированный как: один символ как тип, следующие байты данных. Массив может содержать более одной пары (тип, данные)

#include <stdio.h>
#include <string.h>

char *print_x(char *str)
{
    union
    {
        int i;
        unsigned u;
        long l;
        long long ll;
        float f;
        double d;
    }data;

    switch(*str)
    {
        case 'd':
            memcpy(&data, str + 1, sizeof(double));
            printf("%f", data.d);
            return str + 1 + sizeof(double);
        case 'i':
            memcpy(&data, str + 1, sizeof(int));
            printf("%d", data.i);
            return str + 1 + sizeof(int);
        /* another formats */
        default:
            printf("Not implemented");
            return NULL;
    }
}
int main()
{
    char data[100];
    double x = 1.234;
    int z = 4567;

    char *str = data;

    data[0] = 'd';
    memcpy(&data[1], &x, sizeof(double));
    data[1 + sizeof(double)] = 'i';
    memcpy(&data[2 + sizeof(double)], &z, sizeof(int));

    while((str = print_x(str)))
    {
        printf("\n");
    }

    return 0;
}

Вы можете проверить это и добавить другие типы. https://ideone.com/178ALz

Другие вопросы по тегам