关于reinterpret_cast解决办法

关于reinterpret_cast

C/C++ code
struct chunk_list {
        chunk_list *_next;
        memory_list *_data;
};

struct memory_list {
        memory_list * _next;
};

memory_list *_free_list[0x400];
chunk_list *hunk_node;
memory_list *&temp=_free_list[0];

chunk_node=reinterpret_cast<chunk_list*>(temp);




主要问题: 假设 _free_list 都已经分配好了内存,强制类型转换 从 temp 到 chunk_node的结果是什么?

例如 
temp 地址为 0x20000000;
temp->_next = 0x00000001; 
chunk_node=reinterpret_cast<chunk_list*>(temp); 执行之后。

1. chunk_node指向的地址是哪里?
2. chunk_node使用其next和data指针所指向的地址是否会超过 temp原本的大小?
3. 各种不懂,求解释,越详细越好。


------解决方案--------------------
感觉不用使用reinterpret_cast,使用static_cast就可以了
强制转化之后chunk_node是和temp一样的
他们两个的_next应该是一样的(我目前见过的编译器都是这样的,不知道有没有其它的)
楼主这里也没有太多的东西,没有什么好解释的
------解决方案--------------------
1、0x20000000 reinterpret_cast关键字只是重新解释指针的类型,而不改变其二进制数值。转化后指向temp首字节的地址。此处不可使用static_cast,否则编译失败。具体原因在此不再赘述。
2、访问next和data会出现内存越界的问题。要牢记指针类型只是影响编译器对其所指内存的解释方式。
比如char sz = 'A';对其取址char *psz = &sz; 此时指针psz类型为char*,当对其取引用的使用,编译指令只读取psz指向的第一个字节的值,而如果int *pi = reinterpret_cast<int*>(psz); 然后对pi取引用*pi;这个时候取出的东西肯定是垃圾,因为编译指令把*pi解释为四个字节的int类型。

同理,对于转化后的chunk_node,假设该指针的值为x
当调用chunk_node->next的时候获取x处的值。
chunk_node->data获取x+4处的值,访问越界,因为temp指向的结构体memory_list只占用一个字节。
chunk_node->data会被编译器解释为这样:*((char*)chunk_node + offsetof(chunk_list, data));
offsetof(memory_list, data)表示成员变量data在结构体chunk_list中的偏移量,其值为4,相差一个指针所占有的字节数嘛。*(memory_list*)((char*)chunk_node + 4))显然会出问题,因为这个地方放的是随机的垃圾数据。说的比较多,好好理解一下吧。
------解决方案--------------------
temp是一个指针引用类型,引用了_free_list的第一个元素,该元素类型为memory_list*.在调用reinterpret_cast之后,将原为memory_list*类型的指针转换为chunk_list*类型,在这种情况下,chunk_node的地址与temp相同,都为0x20000000。chunk_node->next的值类型为chunk_list*,大小与memory_list*相同,因此chunk_node->next的值和原来的temp->next的值相同,都为0x00000001,但是当访问chunk_node->data时,将发生越界访问,因为原来的temp所引用的指针指向的对象仅含有一个memory_list*类型的元素,大小为sizeof(memory_list*),而chunk_node->data的起始地址已经超出了分配的空间,这种访问将根据编译器而定,可能抛出异常,也可能访问随机的数据。