首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将C void*指针转换为指向结构的指针(将结构定义为字符串)?

如何将C void*指针转换为指向结构的指针(将结构定义为字符串)?
EN

Stack Overflow用户
提问于 2019-01-30 01:47:48
回答 1查看 136关注 0票数 0

我想把用void*指针指向的存储在内存中的信息打印出来。

但是类型信息在编译类型中不可用。

相反,类型定义的字符串将在运行时可用。有没有办法在运行时将指针转换为适当的类型,以便可以访问指针指向的内存中存储的数据?

我认为这应该是可能的,因为调试器可以访问被调试进程中的原始指针,并使用附加到可执行文件的调试信息(比如DWARF格式)来打印人类可读的信息。我只是不知道这是如何在代码中完成的。

谁能让我知道这是谁做的?谢谢。

编辑。下面是我想在代码中做的事情。

代码语言:javascript
运行
复制
//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。

EN

回答 1

Stack Overflow用户

发布于 2019-01-30 02:15:56

为了向你展示如何在这里解释,你有一小段代码。它字符数组格式为:一个字符作为类型,下一个字节数据。数组可以包含多个对(类型、数据)

代码语言:javascript
运行
复制
#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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54426848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档