关于reinterpret_cast

gqjjqg 2012-08-23 03:03:48

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. 各种不懂,求解释,越详细越好。
...全文
315 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
blldw 2012-08-24
  • 打赏
  • 举报
回复
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的起始地址已经超出了分配的空间,这种访问将根据编译器而定,可能抛出异常,也可能访问随机的数据。
gqjjqg 2012-08-24
  • 打赏
  • 举报
回复
的确没啥好说的,明白这个 reinterpret_cast 这个玩意做什么事情,基本就全知道了。
2,3楼解释挺详细的,给分,结贴,走人。
xingfeng2510 2012-08-23
  • 打赏
  • 举报
回复
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))显然会出问题,因为这个地方放的是随机的垃圾数据。说的比较多,好好理解一下吧。
羽飞 2012-08-23
  • 打赏
  • 举报
回复
感觉不用使用reinterpret_cast,使用static_cast就可以了
强制转化之后chunk_node是和temp一样的
他们两个的_next应该是一样的(我目前见过的编译器都是这样的,不知道有没有其它的)
楼主这里也没有太多的东西,没有什么好解释的
内容概要:本文介绍了一种基于多目标粒子群算法(MOPSO)的微电网优化调度模型,综合考虑风能、光伏、储能系统、柴油发电机、燃气轮机以及与主电网之间的能量交互等多种分布式能源的协同运行。通过构建以运行成本最小化、碳排放最低化和系统可靠性最优化为目标的多目标优化模型,利用Matlab平台实现MOPSO算法求解,完成对微电网在不同运行场景下的能量管理与调度方案优化。该模型能够有效平衡经济性与环保性之间的关系,适用于含多类型分布式电源的复杂微电网系统,具有较强的工程应用价值和科研参考意义; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及工程技术人员,尤其适合从事微电网、智能电网、综合能源系统、可再生能源集成与优化调度等领域研究的专业人士; 使用场景及目标:①用于多能源耦合微电网系统的协同优化调度研究;②支持多目标智能优化算法在能源系统中的建模与求解实践,帮助用户掌握MOPSO在实际工程问题中的应用方法;③为学术论文复现、毕业设计、科研项目开发提供完整的代码实例与技术支撑; 阅读建议:建议读者结合Matlab代码与理论文档,深入理解目标函数构建、约束条件处理及Pareto最优解集生成机制,重点关注算法参数设置、多目标权衡分析与结果可视化,并可通过调整能源配置或引入新约束进行二次开发与创新研究。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧