指向变量的指针在解引用时没有更新变量
pointer to a variable is not updating variable when dereferenced
这是我一直试图解决的调试问题。我知道要使b
等于a
所需要的位掩码。我用gdb检查了a
和b
的区别。变量b
和a
是char[]
类型,在到达'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
只是将地址转换为十进制数。
a
和b
都是数组,当你做需要指针的操作时,它们会衰减为指针。通过将它们转换为int
,您将再次获得变量的地址。该地址不会随着您执行的操作而改变,即使该地址的内容发生了变化。
因为a
和b
都比int
小,你的代码很可能会以非常痛苦的方式搞砸。即使它们的大小是正确的,这也不能保证做正确的事情。
您正在尝试更改b
的地址,但在
*x = *x & 0xffffffff;
您正在更改值,因为您正在解引用x
。您需要将操作应用于x
本身,如
x = x & 0xffffffff;
然后你需要把x重新赋值给b
这将违反严格的混叠规则
相关文章:
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 多个"常量引用"变量可以共享同一个内存吗?
- 如果非动态变量被指针引用,何时超出范围?
- 在 c++ 中将变量作为结构构造函数中的引用传递
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- 为什么C++可以使用未初始化的成员变量(引用或指针 *NOT 值复制*)来初始化其父类的成员变量
- 地址运算符是否返回变量引用的对象的地址
- 未在另一个函数中设置变量引用的问题
- 英特尔样式内联程序集和 AT&T 样式中的变量引用,C++
- 将成员变量引用为类成员
- 从静态变量引用非静态变量会使非静态变量先于静态变量进行析构函数
- 何时解析 C++11 lambda 表达式中的变量引用
- 堆栈/堆变量的变量/引用名称或类型存储在内存中的位置
- C++强制对变量引用进行编译优化,使之成为直接的
- Boost变量引用和相等比较
- 使复制的成员引用变量引用副本的成员,而不是原始成员的成员
- 为什么要在Java中生成变量引用数组
- 捕获和调试对移动lambda内部局部变量引用的无效使用
- 在变量初始化后更改变量引用
- 从'C'程序中提取变量定义和变量引用