Как привести 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