我得到的确切错误是: 错误:在非结构或联合的情况下请求成员'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;
}
答案 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)
我的代码中存在一些错误[打字错误]。
pointme arrow;
应为pointMe arrow;
,依此类推。 [在以下代码中修改] value of
应该是值[int
类型],因此%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;
}
答案 2 :(得分:-1)
使用*(arrow.a).q
或(arrow.a)->q
。