我们有一个看起来像这样的程序:
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;
答案 0 :(得分:1)
指针+整数的指针运算只能在数组对象中完成,否则无效。所以回答你的问题,答案是:无处可去。您无法使用值声明p
指针,因此*((int*) (p + 8)) |= 0x3f;
将以便携方式修改您的TEST
对象。
(C99,6.5.6p8)“如果指针操作数和结果都指向元素 相同的数组对象,或者超过数组对象的最后一个元素,评估不应产生溢出;否则,行为未定义。“
答案 1 :(得分:0)
一种可能性是:
uintptr_t p = (uintptr_t)&TEST - 8;
请注意p
不是指针,使p
指针依赖于实现定义或未定义的行为(取决于你是如何做的),并不是一种可行的方法来获得所需的行为。
答案 2 :(得分:0)
@ kkmah7 - 我想和Grady Player一样:“你究竟想用*((int*) (p + 8)) |= 0x3f
完成什么?”
更具体地说,我想知道“(p + 8)”。您是否尝试修改偏移量(p指向的位置)或值(您尝试将“8”添加到“TEST”)。如果是后者,那么“(p + 8”)是错误的。如果是前者,则为undefined behavior。
这个例子可能有助于澄清:
#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;
}