【发布时间】:2021-09-02 06:14:16
【问题描述】:
在 C++ 中我有:
MallocMetadata *tmp = static_cast<MallocMetadata *> (p);
但现在我希望 tmp 在内存中为 5 个字节,所以我尝试了:
MallocMetadata *tmp = static_cast<MallocMetadata *> (p-5);
但这没有编译,我读了一些建议这个的文章(也没有工作):
MallocMetadata *tmp = static_cast<MallocMetadata *> (static_cast<char *> (p) - 5);
如何解决这个问题,请注意:我确定内存中的位置是合法的,而且我希望 tmp 的类型为 MallocMetadata* 以便以后使用。
【问题讨论】:
-
如果您想弄清楚这一点,为什么要尝试在一行代码中完成所有事情?首先分解代码,看看 2 或 3 行的代码有什么用,然后根据可行的方法将其压缩为一行。此外,使用多行,您有更好的机会确定任何故障点(鉴于代码,这很有可能)。
-
FWIW,创建一个实际上并不指向
MallocMetadata的MallocMetadata *是灾难的根源。您需要非常小心,因为这是在您自己的脚下拍摄的。 -
@NathanOliver 我已经提到它受到保护:)
-
@PaulMcKenzie 进行优化
-
这是XY problem 请解释这段代码应该做什么(什么是业务逻辑/价值)。放弃思考如何解决您的解决方案。您的解决方案很奇怪并且在防御上无效 - 很可能无法修复。
标签: c++ pointers memory casting void-pointers