【问题标题】:c - void pointer to struct inside a structc - 指向结构内结构的 void 指针
【发布时间】:2014-11-18 13:13:49
【问题描述】:

编辑:

我得到的确切错误是: 错误:在不是结构或联合的东西中请求成员“q”

我更正了代码中留下的错别字。它是在为 SO(camel case..) 格式化时发生的。

上下文

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

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

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

失败

显然,在下面代码的 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;
}

【问题讨论】:

  • arrow.a 不是arrow.a 的地址,但它的价值。永远不要混淆指针和指针,即使两者都应该是指针。指针本身就是对象。
  • 我在 3) %p 中替换为 %d。我的错,对不起
  • 你试过我建议的代码了吗?

标签: c pointers struct void


【解决方案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 );

【讨论】:

    【解决方案2】:

    您的代码中有一些错误 [我认为是错别字]。

    1. pointme arrow; 应该是 pointMe arrow; 等等。 [修改如下代码]
    2. value of 应该是值 [int 类型],所以使用 %dprintf()

    检查以下代码

    #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;
    }
    

    【讨论】:

    • 换行不用粘贴整个代码
    • @Jite 更改在 more than one line。请看一看。
    • 我更新了代码。混乱发生在为你的队友格式化时。对此感到抱歉
    • 很好!非常感谢 !但整体比我想象的要复杂得多。我不会找到那个:)
    • @SouravGhosh:我想了解更多关于发生在我身上的事情:(pointMe2*)(arrow.a)->q 还不够,但是 ((pointMe2*) (arrow.a))- >q 是因为某些优先级,对吧?
    【解决方案3】:

    使用*(arrow.a).q(arrow.a)-&gt;q

    【讨论】:

    • (arrow.a)-&gt;q(或arrow.a-&gt;q)等价于(*(arrow.a)).q(*arrow.a).q(忽略两者在没有强制转换的情况下都是无效的),.-&gt;的优先级高于@ 987654329@.
    猜你喜欢
    • 2016-03-21
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 2021-02-02
    • 1970-01-01
    • 2017-01-04
    相关资源
    最近更新 更多