[英]Pointers outside of () statement
我无法理解循环内部发生了什么
char var_64;
char var_24;
int32_t r0_6 = 0;
do
{
*(&var_24 + r0_6) = *(&var_64 + r0_6);
r0_6 = r0_6 + 1;
}
while (r0_6 != 8);
我无法得到这部分:
*(&var_24 + r0_6) = *(&var_64 + r0_6);
它是否将 var_24 的地址加 1 并将 var_64 的地址加 1 分配给它? 指针 * 在这里做什么?
编辑:
这是来自另一个反编译器的相同反编译代码:
char v29[16];
unsigned __int8 v39;
memset(&v39, 0, 8u);
memset(v29, 0, 0x10u);
do
{
*(&v39 + v10) = v29[v10];
++v10;
}
while ( v10 != 8 );
这里我觉得一样,但是它把 v29 显示为一个数组
截至目前,代码调用undefined behavior ,因为您正在尝试使用变量r0_6
,它
然后,在稍后的时间点,一旦初始化r0_6
的值,您实际上是在尝试取消引用 memory 位置*(&var_64 + r0_6)
,[当r0_6
不是 0 时],这是无效的,这又是调用未定义的行为。
简而言之,代码毫无意义。
也就是说,一般来说,语法
*(pointer -or- address)
表示间接或取消引用,即取消引用 memory 位置以到达该位置的值。
char v29[16];
unsigned __int8 v39;
memset(&v39, 0, 8u);
memset(v29, 0, 0x10u);
do
{
*(&v39 + v10) = v29[v10];
++v10;
}
while ( v10 != 8 );
由于这是反编译的代码,我假设原始代码可能如下所示:
{
char v29[16];
int8_t v39[8];
memset(&v39, 0, sizeof (v39));
memset(v29, 0, sizeof(v29));
for(int i = 0; i < sizeof(v39); i++)
{
((char *)(&v39))[i] = v29[i];
}
}
这意味着你有一个二进制字节数组,转换为二进制值,忽略机器字节顺序,所以这可能只是代码的一部分,或者数组已经是正确的字节顺序。
未声明或初始化v10的原因可能是,编译器通过重用一个寄存器来优化代码,该寄存器知道它必须从先前对 memset 的调用中为零。 但这只是一个假设。
该代码在 IMO 中仍然毫无用处,因为当数组初始化为 0 时,结果将始终为零。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.