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指针进行重新赋值?

分析

  1. 首先,指针q所指向的地址,也就是指针q的值和data的值(即data所指向的地址),以及p1的地址是一样的
  printf("data = %p, &data->p1 = %p\n", data, &data->p1);
  printf("q = %p\n", q);
  1. 显然这时候如果按照指针的解引用肯定会出现错误
  *q = (void*)&y;
  1. 不妨这样做
  void **p = (void**)q;
  *p = &y;
  printf("data->p1 = %d\n", *(int*)data->p1);
posted @ 2025-03-26 16:14  蟹蟹你哦  阅读(47)  评论(0)    收藏  举报