C cast void * to type_t

时间:2014-09-10 07:26:16

标签: c pointers void-pointers

我有来自面向对象编程C book的代码:

{
  struct Set { int count; };

  struct Set * set =  malloc(sizeof(struct Set));
  void * p = set;

  const size_t size = * (const size_t *) p;
}

我无法理解最后一行的工作方式和原因。 size_t sizesize_t类型指针的解除引用值。类型为type_t的指针是从void* p强制转换的。 我将void*投射到type_t*时发生了什么,我在本书或在线教程中找不到任何信息。有人可以向我解释或向我推荐一个好的教程吗?

3 个答案:

答案 0 :(得分:1)

所以这里发生的是以下内容:您有一个指向结构(p)的指针,并将其转换为const size_t *指针,并使用结果值。据推测,该值应与p->count的值相同,但并不真正依赖于此。根据{{​​3}} intsize_t不能具有相同的大小,因此您最终可能会访问不属于您的内存。

答案 1 :(得分:0)

此处,void * p正在转换为const size_t *类型,并用作const size_t size变量的初始值设定项。正在使用size_t所持的[const p类型]地址中的值。

答案 2 :(得分:0)

当你将void * p转换为size_t * p时,你告诉编译器p指向的是size_t类型的值

实际上p指向一个Set结构,它碰巧包含一个int。代码假设类型size_t与int的大小相同,standard seems to suggest it will be

但是size_t是无符号的,因此如果int中的值为负,则无法正确读取。目前Set结构中的数据未初始化,因此结果将是随机的