从void指针获取int的问题

时间:2013-12-08 06:35:11

标签: c pointers

我正在建立一个微小的链表库,用于自我充实的目的,这迫使我处理一个我几乎无法解释的问题。以下面的示例为例,假设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内部使用它时,我得到了一个内存地址。我对此有何误解?

1 个答案:

答案 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)
);

您正在取消存储在&datanew_item->data的{​​{1}},该data现在指向{{1}}。这就是打印地址的原因。要获得42,再次取消引用它。