首页 > 解决方案 > () 语句之外的指针

问题描述

我无法理解循环内部发生了什么

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 显示为一个数组

标签: cpointersreference

解决方案


截至目前,代码调用未定义的行为,因为你试图使用一个变量r0_6,它

  • 具有自动存储和.not 初始化。
  • 没有它的地址
  • 可以有陷阱表示。

然后,在稍后的时间点,一旦初始化 的值r0_6,您实际上是在尝试取消引用内存位置*(&var_64 + r0_6)[when r0_6is anything but 0],这是无效的,它再次调用未定义的行为

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

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

 *(pointer -or- address)

表示间接或取消引用,即取消引用该内存位置以到达该位置的值。


推荐阅读