繁体   English   中英

() 语句之外的指针

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM