-1

我们有一个如下所示的程序:

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;

4

3 回答 3

1

指针+整数的指针运算只能在数组对象中进行,否则无效。所以要回答你的问题,答案是:无处可去。您不能声明p具有值的指针,因此*((int*) (p + 8)) |= 0x3f;将以可移植的方式修改您的TEST对象。

(C99, 6.5.6p8) “如果指针操作数和结果都指向同一个数组对象的元素,或者超过数组对象的最后一个元素,则评估不应产生溢出;否则,行为未定义。”

于 2015-11-05T18:20:07.807 回答
0

@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;
}
于 2015-11-05T19:38:01.160 回答
0

一种可能性是:

uintptr_t p = (uintptr_t)&TEST - 8;

请注意,p此处不是指针,创建p指针将依赖于实现定义或未定义的行为(取决于您如何执行),并且不是获得所需行为的可行方法。

于 2015-11-05T18:20:13.790 回答