C语言通过void指针访问结构体的第一个成员
struct data {void *p1;void *p2;int x;
};int main(void)
{int x = 0;int y = 99;struct data *data = (struct data*)malloc(sizeof(struct data));void *q = data;data->p1 = &x;printf("data->p1 = %d\n", *((int*)data->p1));/* TODO */printf("data->p1 = %d\n", *((int*)data->p1));free(data);return 0;
}
如上述代码,如何在TODO处,只是用void指针q进行对结构体指针data中的p1指针进行重新赋值?
分析
- 首先,指针q所指向的地址,也就是指针q的值和data的值(即data所指向的地址),以及p1的地址是一样的
printf("data = %p, &data->p1 = %p\n", data, &data->p1);printf("q = %p\n", q);
- 显然这时候如果按照指针的解引用肯定会出现错误
*q = (void*)&y;
- 不妨这样做
void **p = (void**)q;*p = &y;printf("data->p1 = %d\n", *(int*)data->p1);