我们有一个如下所示的程序:
int TEST = 7;
// Put code here
*((int*) (p + 8)) |= 0x3f;
// TEST should be now 0x3f
您可以看到变量 p 未声明。我的问题是变量 p 应该是什么,以便 TEST 为 0x3f?
我已经尝试过了:
int *p = &TEST;
您现在可以使用指针 p 更改 TEST 的值,但它似乎不适用于*((int*) (p + 8)) |= 0x3f;
我们有一个如下所示的程序:
int TEST = 7;
// Put code here
*((int*) (p + 8)) |= 0x3f;
// TEST should be now 0x3f
您可以看到变量 p 未声明。我的问题是变量 p 应该是什么,以便 TEST 为 0x3f?
我已经尝试过了:
int *p = &TEST;
您现在可以使用指针 p 更改 TEST 的值,但它似乎不适用于*((int*) (p + 8)) |= 0x3f;
指针+整数的指针运算只能在数组对象中进行,否则无效。所以要回答你的问题,答案是:无处可去。您不能声明p
具有值的指针,因此*((int*) (p + 8)) |= 0x3f;
将以可移植的方式修改您的TEST
对象。
(C99, 6.5.6p8) “如果指针操作数和结果都指向同一个数组对象的元素,或者超过数组对象的最后一个元素,则评估不应产生溢出;否则,行为未定义。”
@kkmah7 - 我想知道和 Grady Player 一样的事情:“你到底想用什么来完成*((int*) (p + 8)) |= 0x3f
?”
更具体地说,我想知道“(p + 8)”。您是否尝试修改偏移量(更改 p 指向的位置)或值(您是否尝试将“8”添加到“TEST”)。如果是后者,那么 "(p + 8") 是错误的。如果是前者,那么它是未定义的行为。
这个例子可能有助于澄清:
#include <stdio.h>
int main(int argc, char *argv[]) {
int value = 2;
int *p = &value;
*p += 2;
printf ("value= %d, *p= %d\n", value, *p);
/* Output: value= 4, *p= 4 */
*p |= 0x3f;
printf ("value= %d, *p= %d\n", value, *p);
/* Output: value= 63, *p= 63 */
return 0;
}
一种可能性是:
uintptr_t p = (uintptr_t)&TEST - 8;
请注意,p
此处不是指针,创建p
指针将依赖于实现定义或未定义的行为(取决于您如何执行),并且不是获得所需行为的可行方法。