Как привести C void * указатель на указатель на структуру (с определением структуры как строки)? - PullRequest
0 голосов
/ 29 января 2019

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

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

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

Я думаю, что это должно быть возможно, поскольку отладчик может получить доступ к rawуказатели в процессе отладки и используют отладочную информацию (скажем, в формате 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 Ответ

0 голосов
/ 29 января 2019

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

#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

...