我正在建立一个微小的链表库,用于自我充实的目的,这迫使我处理一个我几乎无法解释的问题。以下面的示例为例,假设new_item->data
是typedef结构中的void指针:
int *data = malloc(sizeof(int));
*data = 42;
MY_LIST *new_item = malloc(sizeof(*new_item));
new_item->data = &data;
// prints what looks like a memory address
printf(
"data: %i\n",
*((int *) new_item->data)
);
//prints 42
int data2 = *((int *) new_item->data);
printf(
"data2: %i\n",
*((int *) data2)
);
就我的(可能是废弃的)大脑而言,在这两种情况下我都使用相同的演员声明 - *((int *) new_item->data)
- 从其容器中导出整数。然而,当我在printf内部使用它时,我得到了一个内存地址。我对此有何误解?
答案 0 :(得分:2)
这就是问题所在。
new_item->data = &data;
它data
指向指针的地址(指向指针的指针)。 data
已经是指针。
跟随
new_item->data = data;
在以下情况
//prints 42
int data2 = *((int *) new_item->data);
printf(
"data2: %i\n",
*((int *) data2) //You are dereferencing the pointer,
);
您正在取消引用指针,这就是它打印42的原因。
在这种情况下
// prints what looks like a memory address
printf(
"data: %i\n",
*((int *) new_item->data)
);
您正在取消存储在&data
中new_item->data
的{{1}},该data
现在指向{{1}}。这就是打印地址的原因。要获得42,再次取消引用它。