我有来自面向对象编程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 size
是size_t
类型指针的解除引用值。类型为type_t的指针是从void* p
强制转换的。
我将void*
投射到type_t*
时发生了什么,我在本书或在线教程中找不到任何信息。有人可以向我解释或向我推荐一个好的教程吗?
答案 0 :(得分:1)
所以这里发生的是以下内容:您有一个指向结构(p
)的指针,并将其转换为const size_t *
指针,并使用结果值。据推测,该值应与p->count
的值相同,但并不真正依赖于此。根据{{3}} int
和size_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结构中的数据未初始化,因此结果将是随机的