我是C ++开发的新手,在学习的过程中我遇到了以下过程:
sws_scale(swsCtx, pictYUV->data, pictYUV->linesize, 0, pictYUV->height,
pictNewYUV->data, pictNewYUV->linesize);
有人可以解释为什么输出是这样的吗?它是一种将A [2]转换为短指针吗?
答案 0 :(得分:1)
它的作用:
A
衰减到char*
到数组的第一个元素。该指针转换为short*
。执行指针算术,将其移动两个短路的空间,然后将其解除引用。当它被解释为short
时,它指向的内存读取为1541(00000101 00000110
)。
为什么不这样做:
这是未定义的行为。严格别名禁止将一种类型的指针转换为另一种任意类型并访问该对象。有些情况是合法的,但这不是其中之一。见注释。
无法保证sizeof(short) == 2
。如果sizeof(short) == 4
,该行将读取超过数组末尾的内容。
您获得的价值取决于字节顺序。
从技术上讲,short
值可能最终成为陷阱表示,但实际上我非常怀疑任何地方都存在任何积分陷阱值。
注意:Stack Overflow上有大量支持/接受的答案包含与*(short*)A
类似的行,但仍然违反了严格的别名。