代码之家  ›  专栏  ›  技术社区  ›  Navaneeth K N

将一个结构指针强制转换为另一个-c

  •  27
  • Navaneeth K N  · 技术社区  · 16 年前

    请考虑以下代码。

    enum type {CONS, ATOM, FUNC, LAMBDA};
    
    typedef struct{
      enum type type;
    } object;
    
    typedef struct {
      enum type type;
      object *car;
      object *cdr;
    } cons_object;
    
    object *cons (object *first, object *second) {
      cons_object *ptr = (cons_object *) malloc (sizeof (cons_object));
      ptr->type = CONS;
      ptr->car = first;
      ptr->cdr = second;
      return (object *) ptr;
    }
    

    在 cons 函数,变量 ptr 属于类型 cons_object* . 但在返回值中,它被转换为 object* .

    1. 我想知道这是怎么可能的,因为 cons_object 和 object 是不同的结构。
    2. 做这种事情有什么问题吗?

    任何想法!

    3 回复  |  直到 9 年前
        1
  •  32
  •   Dean Harding    16 年前

    struct type object cons_object

    foo_object

    void traverse(object *obj)
    {
        if (obj->type == CONS) {
            cons_object *cons = (cons_object *)obj;
            traverse(cons->car);
            traverse(cons->cdr);
        } else if (obj->type == FOO) {
            foo_object *foo = (foo_object *)obj;
            traverse_foo(foo);
        } else ... etc
    }
    

    typedef struct {
        enum type type;
    } object;
    
    typedef struct {
        object parent;
    
        object *car;
        object *cdr;
    } cons_object;
    

        2
  •  17
  •   Jeff Mercado    16 年前


    ptr object type enum type cons_object

                        +---+---+---+---+
    cons_object *ptr -> | t | y | p | e | enum type
                        +---+---+---+---+
                        | c | a | r |   | object *
                        +---+---+---+---+
                        | c | d | r |   | object *
                        +---+---+---+---+
    

    car cdr 4

                        +---+---+---+---+
    ((object *)ptr)  -> | t | y | p | e | enum type
                        +---+---+---+---+
                        | c | a | r |   |
                        +---+---+---+---+
                        | c | d | r |   |
                        +---+---+---+---+
    

    int

                            +---+---+---+---+
    int             *ptr -> | i | n | t |   | int
                            +---+---+---+---+
    

                            +---+---+---+---+
    ((cons_object *)ptr) -> | i | n | t |   | enum type
                            +---+---+---+---+
                            | X | X | X | X | object *
                            +---+---+---+---+
                            | X | X | X | X | object *
                            +---+---+---+---+