c-指向结构内部结构的void指针 编辑:

c-指向结构内部结构的void指针 编辑:,c,pointers,struct,void,C,Pointers,Struct,Void,我得到的确切错误是: 错误:请求非结构或联合中的成员“q” 我纠正了代码中留下的拼写错误。它发生在格式化SOcamel案例时 上下文 设置指向结构的空指针时出现问题 我最初的目标是:我想从一个空指针指向一个结构。 a将指向pointMe2,这样我就可以用一个整数设置pointMe2.q 我的最终目标是:在重用pointMe结构的同时,能够将空指针投射到任何东西。也许我可以指向一个结构,然后再指向一个字符或整数。我想是的 失败 显然,在下面代码的第3部分中,q不是结构或联合的一部分。 看着指针地址

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

我纠正了代码中留下的拼写错误。它发生在格式化SOcamel案例时

上下文 设置指向结构的空指针时出现问题

我最初的目标是:我想从一个空指针指向一个结构。 a将指向pointMe2,这样我就可以用一个整数设置pointMe2.q

我的最终目标是:在重用pointMe结构的同时,能够将空指针投射到任何东西。也许我可以指向一个结构,然后再指向一个字符或整数。我想是的

失败 显然,在下面代码的第3部分中,q不是结构或联合的一部分。 看着指针地址,我知道我已经接近了,但还没有到达那里

我的时髦代码
要么使用*arrow.a.q,要么使用arrow.a->q.

代码中有一些错误[我认为是打字错误]

指向我的箭;应该是指向我的箭;等等[在以下代码中修改] 的值应为[int type]值,因此将%d与printf一起使用。 检查下面的代码

#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;
}
.a成员是一个空指针。不可能取消对void指针的引用,因为不存在void类型。必须首先将指针强制转换为正确的类型:

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

更改一行时无需粘贴整个代码。@Jite更改在多行上。请看一下,我更新了密码。这场混乱是在为你的队友们准备的时候发生的。对不起,很好!谢谢!但整个过程比我想象的要复杂得多。我不会找到那个:@SouravGhosh:我想知道更多关于我的事情:pointMe2*arrow.a->q是不够的,但是pointMe2*arrow.a->q是因为某种优先级,对吧?arrow.a不是arrow.a的地址,而是值。永远不要混淆指针和指针对象,即使两者都应该是指针。指针本身就是对象。我在3%p中替换为%d。我的错误,对不起,你试过我建议的代码了吗?arrow.a->q或arrow.a->q相当于*arrow.a.q和*arrow.a.q忽略了这两个在没有强制转换的情况下都是无效的。和->的优先级高于*。
printf("3)\n arrow.a's address: %p Value of q : %p\n",arrow.a, *(arrow.a)->q );
printf("3)\n arrow.a's address: %p Value of q : %p\n",
       arrow.a,
       ((pointMe2 *)arrow.a)->q);
printf("1)\n Value: %d Address: %p\n", flesh->q, (void *)flesh );