取消引用时,指向变量的指针不会更新变量

时间:2015-09-05 03:09:04

标签: c++ c

这是我一直试图解决的调试问题。我知道我需要应用的位掩码才能使b等于a。我检查了gdb,找出了ab之间的区别。变量bachar[]类型,并在到达'bug'之前设置。

#include <string.h>

int main() {
  char a[1] = "a";
  char b[1] = "b";
  int *x;
  x = (int *) b;
  // bug in next line
  *x = *x & 0xffffffff;
  return memcmp(a, b, 1);
}

a等于b之前,我无法解决问题。给出的唯一约束是错误位于注明的行中,不会更改其他代码。没有规则说我不能在bug之后添加行,但是在memcmp()之前。我发现的问题是我对bit掩码所做的任何事都不会改变b的值。我在错误之前和之后设置了断点并检查了x*x的值,但x似乎没有改变。

Breakpoint 1, main () at test.c:9
9     *x = *x & 0xffffffff;
(gdb) print (int) a
$1 = -6922
(gdb) print (int) b
$2 = -6921
(gdb) print (int) x
$3 = -6921
(gdb) step

Breakpoint 2, main () at test.c:10
10    return memcmp(a, b, 1);
(gdb) print (int) a
$4 = -6922
(gdb) print (int) b
$5 = -6921
(gdb) print (int) x
$6 = -6921

通过修改bug所在的行中的常量,我看不出如何通过请求的方式解决这个问题。任何有助于了解如何使用x使用按位掩码更新b的帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

您正在尝试更改b的地址,但在

*x = *x & 0xffffffff;

您正在更改该值,因为您要取消引用x。你需要将操作应用于x本身,如

x = x & 0xffffffff;

然后你需要将x重新分配给b。

这将与strict aliasing rules发生冲突。

答案 1 :(得分:1)

x是一个指针;将其转换为int只会将地址作为十进制数字。

ab都是数组,当您执行需要指针的操作时,它会衰减为指针。通过将它们转换为int,您将再次获取变量的地址。即使该地址的内容发生变化,地址也不会随着您正在执行的操作而改变。

由于ab都小于int,因此您的代码可能会以非常痛苦的方式陷入困境。即使尺寸合适,也不能保证做正确的事。