C语言通过void指针访问结构体的第一个成员
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);

浙公网安备 33010602011771号