() 语句之外的指针

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 的值,您实际上是在尝试取消引用内存位置 *(&var_64 + r0_6),[当 r0_6 是除 0] 以外的任何值,这是无效的,它再次调用 undefined behavior.

简而言之,代码毫无意义。

也就是说,一般来说,语法

 *(pointer -or- address)

表示indirection or dereference,即取消引用该内存位置以到达该位置的值。

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 时为零。但这只是一个假设。

在我看来,代码仍然毫无用处,因为结果将始终为零,因为数组是用 0 初始化的。