有一个成员函数在这里 http://api.madewithmarmalade.com/classCIwTexture.html#aec689e10ab95a2277d182ba05f1c59db:
uint8* CIwTexture::GetTexels() const;
如果返回值被转换为uint32*
, 例如?如果返回值只是 8 位,那么如何将指向 8 位数据的指针转换为 32 位?
指针只是以地址作为值的变量。这意味着所有指针具有相同的大小(不要与“所有指针”混淆)data具有相同的尺寸”,这是不正确的)。
编译器处理指针所指向的数据所需的所有信息都是从其类型推断出来的。这意味着 a 指向的数据uint32_t
将被视为 32 位数据,并且uint8_t
将被视为 8 位数据。
所有这些信息仅保存在编译时,编译器根据它正在处理的指针生成机器代码。这意味着从一个指针到另一个指针的转换是只与编译器相关,因此它知道在生成代码时如何处理数据。在运行时,没有任何变化,没有值被复制或移动。
Roughly, you memory layout may look like this:
括号部分(数据的大小)是对编译器的提示,以便编译器可以按照程序员的意图处理数据。
When you cast to a uint32_t
, your memory layout will roughly look like this:
现在,您可以从中推断出一些事情:
- 你的指针根本没有改变。它仍然指向相同的位置。
- 您的内存布局也没有改变。您的数据仍然在那里,其他东西也在那里。
- 指针的数据大小确实发生了变化,但此信息仅在编译时保留,因此程序的内存布局根本没有真正改变。
最后,考虑以 32 位方式访问此数据的影响:
- “其他东西”可能是您自己程序的其他部分,如果您修改该值,就会发生不好的事情。
- “其他东西”可能根本不属于您的程序,这意味着它将入侵不属于您的程序的内存。再次,不好的事情将会发生。
-
Maybe“其他内容”是程序访问和修改的完全有效的数据。这应该被清楚地记录下来。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)