指向变量的指针在解引用时没有更新变量

pointer to a variable is not updating variable when dereferenced

本文关键字:变量 引用 更新 指针      更新时间:2023-10-16

这是我一直试图解决的调试问题。我知道要使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()之前添加行。我发现的问题是,我对位掩码所做的任何事情都不会改变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使用逐位掩码将不胜感激。

x是指针;将其转换为int只是将地址转换为十进制数。

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

因为ab都比int小,你的代码很可能会以非常痛苦的方式搞砸。即使它们的大小是正确的,这也不能保证做正确的事情。

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

*x = *x & 0xffffffff;

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

x = x & 0xffffffff;

然后你需要把x重新赋值给b

这将违反严格的混叠规则