c - 指向struct内部struct的void指针

时间:2014-11-18 13:13:49

标签: c pointers struct void

编辑:

我得到的确切错误是: 错误:在非结构或联合的情况下请求成员'q'

我纠正了我在代码中留下的错别字。它是在格式化为SO(骆驼案例..)时发生的。

上下文

设置指向结构的void指针的问题。

我的初始目标 :我想从虚指针指向一个结构。 pointMe.a将指向pointMe2,以便我可以使用整数设置pointMe2.q。

我的最终目标 :能够将该void指针强制转换为任何东西,同时重用我的pointMe结构。也许我可以指向一个结构,很快就会指向一个char或整数。我认为是多态性。

失败

显然,在下面代码的3)中,q不是结构或联合的一部分。 看着指针地址,我知道我很接近,但还没有。

我的时髦代码

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

typedef struct {

    void * a;

}pointMe;

typedef struct {

    int q;

}pointMe2;

int main(void)
{

    pointMe arrow;
    pointMe2 * flesh;

    flesh = malloc(sizeof(pointMe2));
    flesh->q = 4;

    printf("1)\n Value: %d Address: %p\n",flesh->q,flesh );

    arrow.a = flesh;
    printf("2)\n arrow.a's address: %p flesh's address: %p\n",arrow.a,flesh );

    printf("3)\n arrow.a's address: %p Value of q : %d\n",arrow.a, *(arrow.a)->q );

    free(flesh);
    return 0;
}

3 个答案:

答案 0 :(得分:1)

printf("3)\n arrow.a's address: %p Value of q : %p\n",arrow.a, *(arrow.a)->q );

.a成员是void指针。由于没有void类型的东西,因此无法取消引用void指针。您必须首先将指针强制转换为正确的类型:

printf("3)\n arrow.a's address: %p Value of q : %p\n",
       arrow.a,
       ((pointMe2 *)arrow.a)->q);

另请注意,%p转换说明符需要传递void指针。打印flesh的值时,您需要将其转换为void *,然后再将其传递给printf

printf("1)\n Value: %d Address: %p\n", flesh->q, (void *)flesh );

答案 1 :(得分:0)

我的代码中存在一些错误[打字错误]。

  1. pointme arrow;应为pointMe arrow;,依此类推。 [在以下代码中修改]
  2. value of应该是值[int类型],因此%dprintf()一起使用。
  3. 检查以下代码

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct {
    
        void * a;
    
    }pointMe;
    
    typedef struct {
    
        int q;
    
    }pointMe2;
    
    int main(void)
    {
    
        pointMe arrow;            //corrected
        pointMe2 * flesh;         //corrected
    
        flesh = malloc(sizeof(pointMe2));
        flesh->q = 4;
    
        printf("1)\n Value: %d Address: %p\n",flesh->q,flesh );
    
        arrow.a = flesh;
        printf("2)\n arrow.a's address: %p flesh's address: %p\n",arrow.a,flesh );
    
        printf("3)\n arrow.a's address: %p Value of q : %d\n",arrow.a, ((pointMe2 *)(arrow.a))->q );  //corrected
    
        free(flesh);
        return 0;
    }
    

答案 2 :(得分:-1)

使用*(arrow.a).q(arrow.a)->q